如何使用 Python 类属性作为 @Classmethod 的默认值?

Saq*_*Ali 1 python class-method class-attributes

看看下面的代码。

我想使用 的值a作为cclassmethod 声明中参数的默认值my_method()

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

Pau*_*ney 5

这实际上取决于你想要什么,但获得你想要的东西的一种方法就是这样做。

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()
Run Code Online (Sandbox Code Playgroud)

设为默认值并在函数体中None检查 for ,如果发现为 则赋值给。如果您想成为该函数的有效参数,那么它就行不通,但这似乎不太可能。NonecNoneNone

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

这也意味着如果您进行更改X.a,则会my_method获取新值。你可能想要也可能不想要。