繁体   English   中英

Python“属性”的行为异常

[英]Python 'Property' behave strangely

看下面的代码。

class CCC:
    @property
    def n(self):
        print('getter called')
        return self.__dict__['n']

    @n.setter
    def n(self, value):
        print('setter called')
        self.__dict__['n'] = value


c = CCC()
c.n = 5
print(CCC.__dict__)
print(c.__dict__)
print(c.n)

这是执行的结果

setter called
{'__module__': '__main__', 'n': <property object at 0x000000000289CC28>, '__dict__': <attribute '__dict__' of 'CCC' objects>, '__weakref__': <attribute '__weakref__' of 'CCC' objects>, '__doc__': None}
{'n': 5}
getter called # I do not understand why this sentence is printed. 
5

我不明白为什么要打印“ getter”。 CCC有一个n属性对象。 c有一个n作为整数。 当我打印cn ,必须仅打印c.\\__dict__['n'] 取而代之的是打印了“被叫getter”。 我有什么误会?

首先,除非您真的知道自己在做什么并且确实需要它,否则您不应该弄乱__dict__ __ (或带有__包围的任何东西)之类的东西。

也就是说,您将创建一个具有getter(隐式)和setter(显式)的属性。 getter返回值self.__dict__['n']而setter在其中分配一个值。

稍后,您将创建CCC实例,并在cn = 5使用setter。 然后,您正在打印CCC类的__dict__ ,它告诉您有一个名为n的属性。 然后,您将看到实例c__dict__ ,由于设置,该值保持值为5

因此,由于执行cn时正在访问n属性。 当您做self.__dict__['n']您还将获得存储在其中的值,该值是通过setter定义为5

而且,由于您在吸气器中编写了print功能,所以这就是您要打印的内容。

也许通过在setter / getter中的__dict__中调用密钥来完成操作会帮助您整理思路

class CCC:
    @property
    def n(self):
        print('getter called')
        return self.__dict__['nval']

    @n.setter
    def n(self, value):
        print('setter called')
        self.__dict__['nval'] = value


c = CCC()
c.n = 5
print(CCC.__dict__)
print(c.__dict__)
print(c.n)

现在,属性n__dict__的键之间没有思维上的冲突。

暂无
暂无

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

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