3

以下はJavaコードです。Python で同等のコードを知る必要があります。

class A {
    public static A obj = new A();
}
4

4 に答える 4

4

メタクラスでこれを行うことができます:

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が、それを実装するためのそれほど複雑な方法ではありません。

于 2013-06-07T13:41:30.090 に答える
1

クラスのインスタンスを作成する前に、このクラス メンバーが必要ですか? そうでない場合は、最初のインスタンスが作成されたときに割り当てを試すことができます。

class A (object):
    obj = None

    def __init__(self):
        if A.obj is None:
            a.obj = A()
            # or:
            a.obj = self
于 2013-06-07T14:31:30.423 に答える