Python中的类属性

Joe*_*hel 0 python class-attribute

以下两段代码有什么区别吗?如果没有,是否优先于另一个?为什么我们可以动态创建类属性?

片段1

class Test(object):
    def setClassAttribute(self):
        Test.classAttribute = "Class Attribute"

Test().setClassAttribute()
Run Code Online (Sandbox Code Playgroud)

片段2

class Test(object):
    classAttribute = "Class Attribute"

Test()
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 5

首先,在实例方法上设置类属性是一件很奇怪的事情.忽略self参数并向右转Test是另一个奇怪的事情,除非你特别希望所有子类共享一个值.*

*如果你没有特别希望所有子类共享一个单一的价值,我想使它成为一个@staticmethod没有PARAMS(并将其放在Test).但在这种情况下,它甚至没有真正被用作类属性,并且可能作为模块全局更好地工作,具有设置它的自由函数.

所以,即使你想要使用第一个版本,我也会这样写:

class Test(object):
    @classmethod
    def setClassAttribute(cls):
        cls.classAttribute = "Class Attribute"

Test.setClassAttribute()
Run Code Online (Sandbox Code Playgroud)

然而,所有这一切,我认为第二个更加pythonic.以下是注意事项:

  • 通常,在Python中强烈建议不要使用getter和setter.
  • 第一个留下了一个间隙,在这个间隙中,类存在但没有属性.
  • 简单比复杂更好.

要记住的一件事是,Python中不需要getter和setter的部分原因是你总是可以用a来替换属性,@property如果你以后需要它来计算,验证等等.使用class属性,那不是非常完美的解决方案 - 但它通常足够好.


最后一件事:类属性(和类方法,除了备用构造函数)通常是更高级别的非pythonic设计的标志.当然,并非总是如此,但是经常需要大声解释为什么你认为你需要一个类属性并确保它有意义.(如果你曾经编写过一种语言,其成语广泛使用类属性 - 特别是如果它是Java-去找一个从未使用过Java并尝试向他解释的人.)