class A:
class B(A):
pass
Это не работает. Зачем? Как мне сделать то, что ведет себя одинаково?python - наследующий родительский класс
По же я имею в виду:
- То же
__class__.__name__
- То же
__class__.__qualname__
A.B.__base__ is A
class A:
class B(A):
pass
Это не работает. Зачем? Как мне сделать то, что ведет себя одинаково?python - наследующий родительский класс
По же я имею в виду:
__class__.__name__
__class__.__qualname__
A.B.__base__ is A
Нет, не без обходных путей. Первый класс не существует даже в тот момент, когда его тело (включая часть class B(A)
) выполнено. Вы можете определить два separtely хотя:
class A:
pass
class B(A):
pass
A.B = B
B.__name__ = ...
B.__qualname__ = ...
Но если честно это не выглядит как лучший дизайн или API.
Оценка происходит «наизнанку». Класс A не создается до после все в своем классе. Таким образом, в то время, когда B определен, A еще не существует.
Ваш единственный вариант состоит в том, чтобы определить класс B с каким-либо другим базовым классом, а затем написать декоратор класса или метакласс в A, который заглянет внутрь A для атрибутов, которые являются классами с указанной «фиктивной» базой, и воссоздает их с помощью A как их основание.
Реальный вопрос, почему вы чувствуете, что вам нужно это делать.
Просто потому, что метаклассы забавны:
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 дополнительный плюс один не знаю, что вы пытаетесь с этим сделать.)
Какая ошибка? Если это «имя A не определено», это связано с тем, что определение 'A' не выполняется к тому времени, когда B' начинает определяться. – TankorSmash
@TankorSmash: 'строка 2: NameError: имя 'A' не определен'. –
Почему вы объявляете класс B внутри A и наследуете B от A? Я бы подумал, что вы хотите объявить B вне A. – forgivenson