クラスのデフォルトのインスタンスを取得しようとしています。したい
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