属性的问题:描述符的情况下在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