我正在尝试拥有一个类的默认实例。我希望有
class Foo():
def __init__(self):
....
_default = Foo()
@staticmethod
def get_default():
return _default
然而_default = Foo()
导致NameError: name 'Foo' is not defined
我正在尝试拥有一个类的默认实例。我希望有
class Foo():
def __init__(self):
....
_default = Foo()
@staticmethod
def get_default():
return _default
然而_default = Foo()
导致NameError: name 'Foo' is not defined
Foo
在类定义完成之前不存在。不过,您可以在类定义之后轻松引用它:
class Foo(object):
def __init__(self):
# ....
Foo.default_instance = Foo()
另请注意,我已经删除了多余的 getter 方法以支持普通的旧属性。
您还可以使用装饰器解决问题:
def defaultinstance(Class):
Class.default_instance = Class()
return Class
@defaultinstance
class Foo(object):
# ...
或者,无偿地,使用元类:
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):
# ...
您何时可能想要使用每种方法?
您不能引用尚不存在的类。在类定义主体中,尚未创建Foo
类。
创建类后添加属性:
class Foo():
def __init__(self):
....
@staticmethod
def get_default():
return Foo._default
Foo._default = Foo()
请注意,您还需要更改get_default()
静态方法;类主体不形成范围,因此您不能_default
作为非本地 from 到达get_default()
。
然而,你现在经常重复自己。通过创建get_default()
一个类方法来减少重复:
class Foo():
def __init__(self):
....
@classmethod
def get_default(cls):
return cls._default
Foo._default = Foo()
或在第一次调用时创建默认值:
class Foo():
def __init__(self):
....
@classmethod
def get_default(cls):
if not hasattr(cls, '_default'):
cls._default = cls()
return cls._default
你可以懒惰地初始化你的默认实例。
class Foo(object):
_default = None
@staticmethod
def get_default():
if not Foo._default:
Foo._default = Foo()
return Foo._default