使用类方法作为默认参数

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')。