class Test(object):
def __init__(self):
self.name = "changzhi"
@property
def __name__(self):
return self.name
>>> a = Test()
>>> a.__name__
>>> "changzhi"
>>> a.name
>>> "changzhi"
>>> a.__name__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
以下是我的想法:
a.__name__
时,它返回“changzhi”,因为__name__
是class Test(object)
的属性,由“@property”修改。 a.name
时,它会返回“changzhi”,因为name
是a class property
,由__init__
定义。a.__name__()
时,会出现错误,因为__name__
是a class property
,而不是a class function
我的所有想法都正确吗?有人可以向我解释一下吗? __name__
和self.name
(__init__
)之间的区别是什么?
非常感谢!答案 0 :(得分:3)
用self.property
装饰一个函数只是制作一个属性的一种奇特方式。你也可以像这样手动完成:
>>> class X:
def __init__(self):
self.name = "Me"
def set_name(self, other):
self.name = other
def get_name(self):
return self.name + "ABCDE"
dynamicName = property(get_name, set_name)
>>> inst = X()
>>> inst.dynamicName
'MeABCDE'
>>> inst.dynamicName = "You"
>>> inst.dynamicName
'YouABCDE'
请注意dynamicName
是属性,而不是函数。嗯,这只是一种合成糖。现在,让我们继续你的问题。我们可以使用@property
装饰器:
>>> class Y:
def __init__(self):
self.name = "Me"
@property
def dynamicName(self):
#This would be the getter function
return self.name + "ABCDE"
@dynamicName.setter
def set_name(self):
self.name = other
>>> inst = Y()
>>> inst.dynamicName
'MeABCDE'
在上面的代码段中,dynamicName
由property
功能修饰。但是,这种装饰的结果不是功能,而是属性!这会导致你的困惑。
你可以简单地测试一下:
>>> type(inst.dynamicName)
<class 'str'>
希望这有帮助!