我想这样做:
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的类构造中没有自我引用。
有没有办法实现这个目标(如果我们将事物设为实例属性,那显然是微不足道的,但我想成为一个类属性!)?
答案 0 :(得分:1)
在类声明后立即执行调用:
class MyClass(object): pass
MyClass.thing = MyThing(MyClass)
答案 1 :(得分: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'>
答案 2 :(得分:0)
也许您可以使用__new__
初始化课程?
答案 3 :(得分:0)
使用desciptor:
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'>
答案 4 :(得分: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