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 的类构造中没有 self 可以引用。

有什么方法可以实现这一点(如果我们将事物设为实例属性显然是微不足道的,但我想成为一个类属性!)?

4

5 回答 5

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 回答
1

在类声明之后立即执行调用:

class MyClass(object): pass
MyClass.thing = MyThing(MyClass)
于 2012-06-27T15:38:04.233 回答
0

也许你可以用__new__?

于 2012-06-27T15:40:09.950 回答
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

啊,使用 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 回答