Неправильный синтаксис при вложении 3 классов в Python?

Будет ли простой способ исправить эту ошибку, сохраняя все 3 уровня?

Получение ClassA от объекта не помогает.

Заранее спасибо!

>>> class classA:
...     class classB(object):
...         def __init__(self):
...             self.b = 3
...         class classC(classA.classB):
...             def __init__(self):
...                 super(classC, self).__init__()
...                 self.c = 4
...
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 2, in classA
  File "", line 5, in classB
NameError: name 'classA' is not defined
3
nl ja de
имена классов будут короче, а код будет более читабельным
добавлено автор Yulia V, источник
также хотел понять, почему thid = s не работает; возможно, я пропустил какую-то важную концепцию
добавлено автор Yulia V, источник
@ F.C. да, я тоже думал, что это нужно, но это не так; см. последнюю строку в примере кода, это сообщение об ошибке
добавлено автор Yulia V, источник
@ Маркус: правильно, кроме того, что я не 'он'
добавлено автор Yulia V, источник
Вы можете добавить это на свою страницу профиля или выбрать изменить свое имя пользователя, чтобы люди заметили, в противном случае предположение по умолчанию «он», потому что это чаще всего правильно, к сожалению.
добавлено автор phant0m, источник
classA.classB.classC не менее короче classC ...
добавлено автор glglgl, источник
Зачем вам это делать?
добавлено автор Daniel Roseman, источник
@glglgl Может быть, он сохранит тот или иной префикс с этим.
добавлено автор Markus Unterwaditzer, источник

2 ответы

Нет. В то время, когда вы определяете classC , classA еще не существует.

Он создается только после полного выполнения его тела. (Диск, созданный из исполнения тела, является одним параметром для вызова создания класса class = type ('classname', (superclass_1, superclass_2, superclass_3), said_dict}) .)

Самый простой способ - определить их на одном уровне.

Если это абсолютно необходимо, вы можете изменить их позже:

class classA:
    pass
class classB(object):
    def __init__(self):
        self.b = 3
class classC(classB):
    def __init__(self):
        super(classC, self).__init__()
        self.c = 4
classA.classB = classB
classB.classC = classC
8
добавлено
Возможно, было бы полезно добавить к вашему ответу объяснение, почему classA не может существовать до тех пор, пока не будут выполнены все утверждения в классе класса.
добавлено автор Duncan, источник

Возможно, что-то вроде этого будет работать:

class classA:
    pass

class classB(object):
    def __init__(self):
        self.b = 3
classA.classB = classB

class classC(classA.classB):
    def __init__(self):
        super(classC, self).__init__()
        self.c = 4

classA.classB.classC = classC
1
добавлено
Помимо того, что последняя строка более сложная, это ничего не добавляет к ответу @ glglgl.
добавлено автор Duncan, источник
@Duncan, вы правы, но когда я разместил его ответ glglgl, у него не было кода
добавлено автор Facundo Casco, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community