Skip to main content
 首页 » 编程设计

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

2025年05月04日8bhlsheji

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

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)到某个类,那么它的行为就像解释您所看到的内容的任何其他类(对象)一样。