2014-01-28 3 views
2
class A: 
    class B(A): 
     pass 

Это не работает. Зачем? Как мне сделать то, что ведет себя одинаково?python - наследующий родительский класс

По же я имею в виду:

  • То же __class__.__name__
  • То же __class__.__qualname__
  • A.B.__base__ is A
+0

Какая ошибка? Если это «имя A не определено», это связано с тем, что определение 'A' не выполняется к тому времени, когда B' начинает определяться. – TankorSmash

+0

@TankorSmash: 'строка 2: NameError: имя 'A' не определен'. –

+0

Почему вы объявляете класс B внутри A и наследуете B от A? Я бы подумал, что вы хотите объявить B вне A. – forgivenson

ответ

8

Нет, не без обходных путей. Первый класс не существует даже в тот момент, когда его тело (включая часть class B(A)) выполнено. Вы можете определить два separtely хотя:

class A: 
    pass 

class B(A): 
    pass 

A.B = B 
B.__name__ = ... 
B.__qualname__ = ... 

Но если честно это не выглядит как лучший дизайн или API.

1

Оценка происходит «наизнанку». Класс A не создается до после все в своем классе. Таким образом, в то время, когда B определен, A еще не существует.

Ваш единственный вариант состоит в том, чтобы определить класс B с каким-либо другим базовым классом, а затем написать декоратор класса или метакласс в A, который заглянет внутрь A для атрибутов, которые являются классами с указанной «фиктивной» базой, и воссоздает их с помощью A как их основание.

Реальный вопрос, почему вы чувствуете, что вам нужно это делать.

0

Просто потому, что метаклассы забавны:

class GoofyMeta(type): 
    def __new__(cls, clsname, bases, dct): 
     dct['__qualname__'] = bases[0].__qualname__ 
     return super(GoofyMeta, cls).__new__(cls, bases[0].__name__, bases, dct) 

class A: 
    pass 

#using python 3 syntax here 
class B(A,metaclass=GoofyMeta): 
    pass 

B.__name__ 
Out[24]: 'A' 

B.__qualname__ 
Out[25]: 'A' 

И B.__base__ является A по определению.

Что касается того, зачем вам это нужно, я довольно озадачен. Похоже, что вы можете просто использовать наследование/композиции обычно, как и остальные из нас :-)

(я также отметить, что я не обращался B каким-то образом быть внутренний класс A. I дополнительный плюс один не знаю, что вы пытаетесь с этим сделать.)

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