如何使用 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
将采用新值。你可能想要也可能不想要那个。
看看下面的代码。
我想在类方法 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
将采用新值。你可能想要也可能不想要那个。