如何使用 Python Class 属性作为 @Class 方法的默认值?

How can I use a Python Class attribute as a default value for a @Classmethod?

看看下面的代码。

我想在类方法 my_method() 的声明中使用 a 的值作为参数 c 的默认值。

我该怎么做?下面的例子失败了。

>>> class X:
...     a = 'hello'
...     def __init__(self, b):
...         self.b = b
...     @classmethod
...     def my_method(cls, c=X.a):
...         print 'cls.a = {}'.format(cls.a)
...         print 'c = {}'.format(c)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in X
NameError: name 'X' is not defined

这真的取决于您想要什么,但是获得您似乎想要的东西的一种方法就是这样做。

class X:
    a = 'hello'
    def __init__(self, b):
        self.b = b
    @classmethod
    def my_method(cls, c=None):
        if c is None:
            c = X.a
        print('cls.a = {}'.format(cls.a))
        print('c = {}'.format(c))

X.my_method()

默认None,在函数体中检查None,发现None赋值给c。如果您曾经希望 None 成为该函数的有效参数,那么它不会起作用,但这似乎不太可能。

这个惯用语经常在 python 中使用以避免陷阱可变默认参数,但在这里它将赋值从 X.a 延迟到实际定义 X 之后。

这也意味着,如果您更改 X.a,则 my_method 将采用新值。你可能想要也可能不想要那个。