以下はJavaコードです。Python で同等のコードを知る必要があります。
class A {
public static A obj = new A();
}
メタクラスでこれを行うことができます:
class SelfReferencingObjectMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['obj'] = property(lambda self: self.__class__.obj)
return super(SelfReferencingObjectMetaclass, cls).__new__(cls, name, bases, attrs)
@property
def obj(cls):
try:
return cls._obj
except AttributeError:
cls._obj = cls()
return cls._obj
class A(object):
__metaclass__ = SelfReferencingObjectMetaclass
ただし、@Daniel Roseman が @jamylak の回答へのコメントで指摘しているように、おそらく、これよりも問題を解決するためのより簡単でより Pythonic な方法があります。そのコメントに続いて、オブジェクト構造に関して同一ではないにしても、これを機能的に達成する方法は、次のようなモジュールを持つことです。
a.py
class A(object):
@property
def obj(self):
return a_inst
a_inst = A()
これは、それを利用するコードでやや醜い構造を作成しますfrom a import A
が、それを実装するためのそれほど複雑な方法ではありません。
クラスのインスタンスを作成する前に、このクラス メンバーが必要ですか? そうでない場合は、最初のインスタンスが作成されたときに割り当てを試すことができます。
class A (object):
obj = None
def __init__(self):
if A.obj is None:
a.obj = A()
# or:
a.obj = self