我不明白为什么下面的代码会给出两个不同的输出
class foo(object):
def myget(self):
return 3
goo=property(myget)
hh1=[1,2,3]
hh1[0]=property(myget)
def hh(self):
print self.goo
print self.hh1[0]
ff=foo()
ff.hh()
输出:
3
<property object at 0x292a998>
谢谢
请您参考如下方法:
property 对象是 descriptors .描述符只有在绑定(bind)到一个类时才有特殊的权力。否则,它们的行为与任何其他类完全一样。当您将属性放在列表中时,它没有绑定(bind)到类,因此它失去了它的特殊属性。
例如,让我们看一下property written in pure python 的实现作为描述符:
class Property(object):
"Emulate PyProperty_Type() in Objects/descrobject.c"
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
self.__doc__ = doc
def __get__(self, obj, objtype=None):
if obj is None:
return self
if self.fget is None:
raise AttributeError, "unreadable attribute"
return self.fget(obj)
def __set__(self, obj, value):
if self.fset is None:
raise AttributeError, "can't set attribute"
self.fset(obj, value)
def __delete__(self, obj):
if self.fdel is None:
raise AttributeError, "can't delete attribute"
self.fdel(obj)
注意 __get__、__set__ 和 __delete__ 的第二个参数是 obj 吗? obj 是描述符绑定(bind)到的类的实例(如果有助于澄清事情,它会作为 self 传递给方法)。为了使整个 shebang 工作,描述符必须绑定(bind)到一个类,以便可以调用 __get__ 并将 obj 传递给它。如果描述符没有绑定(bind)到一个类,那么 __get__ 就不会被调用,你的描述符类就变成了另一个类,它有几个永远不会被调用的魔法方法(除非你明确地调用它们) .
也许更具体一点,当你这样做的时候:
a = instance.my_descriptor
这会调用 my_descriptor.__get__(instance) 并相应地:
instance.my_descriptor = a
调用 my_descriptor.__set__(instance,a)
但是,如果 my_descriptor 没有绑定(bind)到某个类,那么它的行为就像解释您所看到的内容的任何其他类(对象)一样。
