2

私はこれをしたい:

class MyThing(object):
    def __init__(self,owning_cls):
        self.owning_cls = owning_cls

class MyClass(object):
    thing = MyThing(self.__class__)

print MyClass.thing.owning_cls

MyClass のクラス構築で参照する自己がないため、これは機能しません。

これを達成する方法はありますか (物事をインスタンス属性にすると明らかに簡単ですが、クラス属性になりたいです!)?

4

5 に答える 5

1

クラス宣言の直後に呼び出しを実行します。

class MyClass(object): pass
MyClass.thing = MyThing(MyClass)
于 2012-06-27T15:38:04.233 に答える
1

デコレータを使用します。これは、クラス定義の後に追加のクラス関連のコードを記述したり、インスタンス化を強制したりするのではなく、より多くのクラス定義を一緒に保持できるため、クリーンなソリューションであることがわかりましたMyClass

class MyThing(object):
    def __init__(self,owning_cls):
        self.owning_cls = owning_cls

def set_thing(cls):
    cls.thing = MyThing(cls)
    return cls

@set_thing
class MyClass(object):
    pass

>>> print MyClass.thing.owner_cls
<class '__main__.MyClass'>
于 2012-06-27T18:07:23.133 に答える
0

ここでは、use MetaClasses コメントが大いに役立ちます。

これは、私が望むものを正確に達成するための「簡単な」方法のように見えます

class MyClassMetaclass(type):
    def __new__(cls, name, bases, dct):
        cls.thing = MyThing(name)
        return super(MyClassMetaclass, cls).__new__(cls, name, bases, dct)

class MyThing(object):
    def __init__(self,owning_cls):
        self.owning_cls = owning_cls

class MyClass(object):
    __metaclass__=MyClassMetaclass

print MyClass.thing.owning_cls
于 2012-06-27T18:14:22.620 に答える
0

使用記述子:

class Ownable(object):
    def __init__(self, clz):
        self._clz = clz
        self._inst = None
    def __get__(self, inst, owner_clz):
        self._inst = self._inst or self._clz(owner_clz)
        return self._inst

class MyThing(object):
    def __init__(self, owner_clz):
        self.owner_clz = owner_clz

class MyClass(object):
    thing = Ownable(MyThing)

>>> print MyClass.thing.owner_clz
<class '__main__.MyClass'>
于 2012-06-27T17:21:01.890 に答える
0

でクラスを初期化できます__new__か?

于 2012-06-27T15:40:09.950 に答える