Python“Property”的行为很奇怪

2024-04-28 16:40:14 发布

您现在位置:Python中文网/ 问答频道 /正文

请看下面的代码

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属性对象cn为整数。当我打印c.n时,必须只打印c.\__dict__['n']。取而代之的是“getter called”。我误解了什么


Tags: of代码selfobjectsvaluedefattributeproperty
1条回答
网友
1楼 · 发布于 2024-04-28 16:40:14

首先,除非你真的知道你在做什么并且真的需要它,否则你不应该和__dict__(或者任何被__包围的东西)打交道

也就是说,您可以使用getter(隐式)和setter(显式)创建一个属性。getter返回值self.__dict__['n'],setter在那里赋值

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

因此,因为您在执行c.n时访问了n属性。当您执行self.__dict__['n']时,您也会得到存储在那里的值,您确实通过setter将其定义为5

既然您在getter中编写了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__中的键之间没有精神名称冲突

相关问题 更多 >