При создании класса , видно только его имя. Его содержимое еще не существует, пока класс не будет создан. Поэтому части внутри класса не могут получить доступ к каким-либо полям класса во время создания. Таким образом, вы должны будете использовать полные имена для обозначения того, что вы хотите получить доступ к полям класса
Вы в настоящее время создания класса SimpleModel
и при этом вы создаете класс Attributes
и при этом класса __metaclass__
. Поскольку пока вы это делаете, класс SimpleModel
еще не существует, метод __init__
еще не является частью чего-либо существующего. Сначала он создается, а затем, позже, станет частью класса __metaclass__
. Следовательно, это не может знать идентификатор __metaclass__
. И так как __metaclass__
также никогда не становится глобальным, при вызове этот идентификатор не может быть известен.
Вот причина, почему вы не имеете в своем объеме в данный момент не __metaclass__
, но когда позже __init__
вызывается, только SimpleModel
доступен через глобальную область видимости, так что вы можете основывать свое имя на нем: SimpleModel.Attributes.__metaclass__
.
Не могли бы вы дать мне больше кода для работы, чтобы я мог просто быстро запустить его и посмотреть, могу ли я воспроизвести проблему? –
Я пробовал воспроизвести проблему, и выясняется, что вы не можете иметь классы внутри классов, которые имеют методы __init__, которые вызывают супер. Это не только 3-й уровень наследования, даже если вы пытались называть 'super' внутри' Attributes', то это не сработало бы. Вам нужно будет вызвать 'SimpleModel.Attributes', чтобы получить его. –