首先,在实例方法上设置类属性是一件很奇怪的事情。并且忽略self
参数并直接执行Test
是另一件奇怪的事情,除非您特别希望所有子类共享一个值。*
* 如果您确实希望所有子类共享一个值,我会将其@staticmethod
设为不带参数的(并将其设置为Test
)。但在那种情况下,它甚至没有真正被用作类属性,并且可能作为一个全局模块更好地工作,并带有一个自由函数来设置它。
所以,即使你想使用第一个版本,我也会这样写:
class Test(object):
@classmethod
def setClassAttribute(cls):
cls.classAttribute = "Class Attribute"
Test.setClassAttribute()
然而,话虽如此,我认为第二个更像pythonic。以下是考虑因素:
- 一般来说,Python 中强烈建议不要使用 getter 和 setter。
- 第一个留下了类存在但没有属性的间隙。
- 简单胜于复杂。
要记住的一件事是,在 Python 中不需要 getter 和 setter 的部分原因是,@property
如果您以后需要计算、验证等属性,您总是可以用 a 替换属性。对于类属性,这不是相当完美的解决方案——但它通常已经足够好了。
最后一件事:类属性(和类方法,除了替代构造函数)通常是更高级别的非 Python 设计的标志。当然,并非总是如此,但经常有必要大声解释为什么你认为你需要一个类属性并确保它有意义。(如果你曾经用一种语言编程,其习惯用法广泛使用类属性——尤其是 Java 的话——去找一个从未使用过 Java 的人,并尝试向他解释。)