请看下面的代码
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
为整数。当我打印c.n
时,必须只打印c.\__dict__['n']
。取而代之的是“getter called”。我误解了什么
首先,除非你真的知道你在做什么并且真的需要它,否则你不应该和
__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__
键可以帮助您整理您的思想现在,属性
n
和__dict__
中的键之间没有精神名称冲突相关问题 更多 >
编程相关推荐