[英]Open() and codecs.open() in Python 2.7 behave strangely different
[英]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.