在类定义中创建类的实例

min*_*iao 0 python

我正在尝试拥有一个类的默认实例.我希望有

class Foo():
    def __init__(self):
        ....

    _default = Foo()

    @staticmethod
    def get_default():
        return _default
Run Code Online (Sandbox Code Playgroud)

然而_default = Foo()导致NameError: name 'Foo' is not defined

kin*_*all 5

Foo在类定义完成之前不存在.但是,您可以在类定义之后轻松地引用它:

class Foo(object):
    def __init__(self):
    # ....

Foo.default_instance = Foo()
Run Code Online (Sandbox Code Playgroud)

还要注意我已经删除了多余的getter方法,而不是普通的旧属性.

您还可以使用装饰器解决问题:

def defaultinstance(Class):
    Class.default_instance = Class()
    return Class

@defaultinstance
class Foo(object):
    # ...
Run Code Online (Sandbox Code Playgroud)

或者,无偿地,使用元类:

def defaultmeta(name, bases, attrs):
    Class = type(name, bases, attrs)
    Class.default_instance = Class()
    return Class

# Python 2.x usage
class Foo(object):
    __metaclass__ = defaultmeta
    # ...

# Python 3.x usage
class Foo(metaclass=defaultmeta):
    # ...
Run Code Online (Sandbox Code Playgroud)

您何时可能想要使用每种方法?

  • 使用post-definition类属性赋值为一次性
  • 如果你想在很多不相关的类中使用相同的行为并且"隐藏"它的实现(它不是真的隐藏,或者甚至那么复杂,在这里),请使用装饰器
  • 如果您希望行为可以继承,请使用元类,在这种情况下,它不是真正无偿的.:-)