繁体   English   中英

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

[英]python assign build-in property function to list element

我不明白为什么下面的代码给出两个不同的输出

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对象是描述符 描述符仅在绑定到类时才具有特殊功能。 否则,它们的行为与任何其他类完全相同。 当将该属性放在列表中时,它没有绑定到该类,因此会丢失其特殊属性。


例如,让我们看一下用纯python作为描述符编写property的实现:

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__可以调用__get__并将obj传递给它。 如果描述符未绑定到类,则不会调用__get__ ,并且您的描述符类将变为具有两个永远不会被调用的魔术方法的另一个类(除非您显式调用它们)。

在执行以下操作时,也许更具体一点:

a = instance.my_descriptor

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

instance.my_descriptor = a

调用my_descriptor.__set__(instance,a)

但是,如果my_descriptor未绑定到类,则它的行为就像解释您所看到的内容的任何其他类(对象)一样。

我认为这可能与字典有关。 描述符(属性)仅响应object或class dict中的属性。 hh1 []和goo都在foo中。 字典 但是hh1 [0]无效,因此描述符在hh1 [0]中不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM