使用类方法作为默认参数
Use classmethod as default argument
如果我这样做:
class MyClass(object):
def __init__(self, a=MyClass.f):
self.a = a
@classmethod
def f():
print 'tump drump'
我收到以下错误:
NameError: name 'MyClass' is not defined
显然,我可以这样做:
class MyClass(object):
def __init__(self, a=None):
if a is None:
self.a = MyClass.f
else:
self.a = a
但是有没有更优雅的方法来使用 class 方法作为 class 方法的默认参数?
不,没有,因为函数是在 class 对象之前创建的。这里没有class可以参考,使用哨兵(如None
)才是正确的做法
请注意,如果您分配给 a
而不是 if
套件中的 self.a
,则无需使用 else
套件:
class MyClass(object):
def __init__(self, a=None):
if a is None:
a = MyClass.f
self.a = a
或者您可以使用条件表达式:
class MyClass(object):
def __init__(self, a=None):
self.a = MyClass.f if a is None else a
甚至:
class MyClass(object):
def __init__(self, a=None):
self.a = a or MyClass.f
如果您需要支持的只是真实对象(例如,函数对象在布尔上下文中总是 'true')。
如果我这样做:
class MyClass(object):
def __init__(self, a=MyClass.f):
self.a = a
@classmethod
def f():
print 'tump drump'
我收到以下错误:
NameError: name 'MyClass' is not defined
显然,我可以这样做:
class MyClass(object):
def __init__(self, a=None):
if a is None:
self.a = MyClass.f
else:
self.a = a
但是有没有更优雅的方法来使用 class 方法作为 class 方法的默认参数?
不,没有,因为函数是在 class 对象之前创建的。这里没有class可以参考,使用哨兵(如None
)才是正确的做法
请注意,如果您分配给 a
而不是 if
套件中的 self.a
,则无需使用 else
套件:
class MyClass(object):
def __init__(self, a=None):
if a is None:
a = MyClass.f
self.a = a
或者您可以使用条件表达式:
class MyClass(object):
def __init__(self, a=None):
self.a = MyClass.f if a is None else a
甚至:
class MyClass(object):
def __init__(self, a=None):
self.a = a or MyClass.f
如果您需要支持的只是真实对象(例如,函数对象在布尔上下文中总是 'true')。