2015-07-31 2 views
0

Допустим, у меня есть что-то вроде этого -Получение класса переменной пребывает в

class A(object): 
    c = C() 

class B(A): 
    pass 

class C(object): 
    def __init__(self): 
     pass 

    def get_parent_class(self): 
     # This should return B 

Как бы реализовать get_parent_class, так что он будет работать следующим образом -

B.c.get_parent_class() # Returns the class type B (not the instance b!) 

Это возможно даже ?

В основном у меня есть родительский класс (класс A), который содержит переменную (var c в примере). Я тогда ребенок-класс (класс B который наследует A)

Я хочу использовать функции, которые C выставляет на B, но для того, чтобы использовать должным образом, мне нужно C знать, что это работает на B

(Надеюсь, я не усложнять в последнем объяснении ...)

Edit - Пожалуйста, обратите внимание, что я не пытаюсь получить класс C, это легко c.__class__. Мне нужен класс c

Спасибо!

+0

'C = C() 'вызывает исключение, поскольку' C' еще не определен. – falsetru

+0

Возможный дубликат [Получение имени класса экземпляра в Python] (http://stackoverflow.com/questions/510972/getting-the-class-name-of-an-instance-in-python) – Stiffo

+1

@Stiffo: не дублирующийся OP хочет имя класса класса *, содержащего * c, а не имя класса C или его родителя. –

ответ

-1

Вы можете взглянуть на атрибут __bases__ вашего объекта. Он возвращает кортеж базовых классов для объекта.

Вы можете увидеть его в документах here.

-1

Вы можете получить класс от имени атрибута, например:

>>> import itertools 
>>> x = itertools.count(0) 
>>> x.__class__.__name__ 
'count' 

Или так:

>>> type(x).__name__ 
'count' 
1

AFAIK, вы не можете сделать это.

B.c просто возвращает ссылку на объект C. Тот же объект может быть членом списка, экземпляра другого класса (скажем, D) и другого класса (скажем, E)

Просто добавьте к вашему примеру:

class D: 
    def __init__(self, c): 
     self.c = c 
class E: 
    c = C() 

Тогда:

>>> c = B.c 
>>> E.c = c 
>>> d = D(c) 
>>> c.a = 1 
>>> B.c.a 
1 
>>> d.c.a 
1 
>>> E.c.a 
1 

В этот момент c сам объект не знает, что он принадлежит B, d и E. И что должно быть c.get_parent_class()? Как выбрать между B и E?

Вы могли бы попытаться сделать C знать о своем контейнере:

class C(object): 
    def __init__(self, clazz): 
     self.clazz = clazz 

    def get_parent_class(self): 
     return self.clazz 

class A(object): 
    c = C(A) 

Вы бы A.c.get_parent_class() давая <class '__main__.A'>, но как это будет тот же объект, B.c.get_parent_class() также даст <class '__main__.A'> ...

Смежные вопросы