2012-06-27 3 views
2

Я хотел бы сделать это:Доступ к типу класса при построении атрибута класса в python?

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

Вы можете использовать метакласс. – JBernardo

ответ

1

Выполните вызов сразу после объявления класса:

class MyClass(object): pass 
MyClass.thing = MyThing(MyClass) 
0

Может быть, вы можете инициализировать класс с __new__?

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'> 
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'> 
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 
Смежные вопросы