Python“类属性”和“类函数”

时间:2014-01-17 06:42:37

标签: python

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

以下是我的想法:

  1. 当我运行a.__name__时,它返回“changzhi”,因为__name__class Test(object)的属性,由“@property”修改。
  2. 当我运行a.name时,它会返回“changzhi”,因为namea class property,由__init__定义。
  3. 当我运行a.__name__()时,会出现错误,因为__name__a class property,而不是a class function 我的所有想法都正确吗?有人可以向我解释一下吗? __name__self.name__init__)之间的区别是什么? 非常感谢!

1 个答案:

答案 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'

在上面的代码段中,dynamicNameproperty功能修饰。但是,这种装饰的结果不是功能,而是属性!这会导致你的困惑。

你可以简单地测试一下:

>>> type(inst.dynamicName)
<class 'str'>

希望这有帮助!