python将内置属性函数分配给list元素

时间:2012-10-10 01:08:16

标签: python

我不明白为什么以下代码会提供两种不同的输出

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>

由于

2 个答案:

答案 0 :(得分:1)

property个对象为descriptors。描述符在绑定类时仅具有特殊权限。否则,它们的行为与任何其他类完全相同。当您将属性放在列表中时,它不会绑定到类,因此它会丢失它的特殊属性。


举个例子,让我们看一下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是描述符绑定的类的实例(如果有助于澄清事情,它将作为self传递给方法)。为了使整个shebang工作,描述符必须绑定到一个类,以便可以调用__get__并将obj传递给它。如果描述符没有绑定到类,则__get__不会被调用,并且您的描述符类变成另一个类,其中包含几个永远不会被调用的魔术方法(除非您明确地调用它们)。

当你这样做时,可能会更具体一点:

a = instance.my_descriptor

这会调用my_descriptor.__get__(instance)并相应地调用:

instance.my_descriptor = a

致电my_descriptor.__set__(instance,a)

但是,如果my_descriptor没有绑定到某个类,那么它的行为就像任何其他类(对象)一样,它解释了你所看到的内容。

答案 1 :(得分:0)

我认为它可能与 dict 有关。 descriptor(property)仅响应对象或类 dict 中的属性。 hh1 []和goo都在foo中。 dict 。但是hh1 [0]不是因为描述符在hh1 [0]中不起作用。