屬性的問題:描述符的情況下在Python
爲什麼不能描述符是實例的屬性?
它一直answered說:
描述對象需要生活中的類,而不是實例
,因爲這是該__getattribute__
的實現方式。
一個簡單的例子。考慮一個描述:
class Prop(object):
def __get__(self, obj, objtype=None):
if obj is None:
return self
return obj._value * obj._multiplier
def __set__(self, obj, value):
if obj is None:
return self
obj._value = value
class Obj(object):
val = Prop()
def __init__(self):
self._value = 1
self._multiplier = 0
考慮每個OBJ具有多個支柱的情況:我需要使用唯一的名稱標識值和乘數(像here有每個實例描述符對象將允許存儲。 。_multiplier
(和_value
)在描述符本身,簡化了一些東西
每個實例描述實現屬性,你需要:
我知道,類似的問題之前已經提出了,但我還沒有找到一個真正的解釋:
- 爲什麼Python是這樣設計?
- 什麼是建議的方式來存儲描述符需要的信息,但是每個實例?
您可以通過** break object orientation **擴展您的意思嗎?其次,我用這種方法看到的問題是如何提供一個簡單的API來改變乘數。用戶將不得不像'obj._multiplier [Obj.val] = 10'這樣做。這可以包含在一個函數'def change_multiplier(self,attr_name,new_value)'中,但如果Prop屬性有多個屬性,則不會很好地縮放。像def prop(self,attr_name):返回自我。__dict __ [attr_name]'可以用來做'obj.prop('val')。multiplier = 10'。 – Hernan
@ Hernan有一個通常的假設,即實例具有相同的類型;違反了這一點,各種事情將會破裂。就改變乘數而言,也許是代理財產? - 見上面的編輯。 – ecatmur
確實所有實例的類型都不相同,但是您可能會創建子類,因此isinstance仍然可以工作。關於代理人,我寫了類似的東西,但我不確定這是一個好主意。基本上,'obj.prop('val')'返回一個知道'obj'和'val'的代理對象。當你執行'obj.prop('val')。multiplier = 10'時,它會寫入'obj._multiplier [val] = 10'。我只是不確定它會如何維護。 – Hernan