2016-09-01 4 views
0

Я пытаюсь позвонить по значению из класса B, который вложен в классе А и использовать его в классе C. Я получаю AttributeError:Python: Вызов для значения внутри вложенного класса

class A(): 
    class B(): 
     a = 1 
    class C(): 
     b = 2 
     c = B.a + b 
AttributeError: class B has no attribute 'a' 

I также пытался позвонить из «A», PyCharm признать это, но питона до сих пор получить AttributeError:

class A(object): 
    class B(object): 
     a = 1 
    class C(object): 
     b = 2 
     c = A.B.a + b 
AttributeError: class A has no attribute 'B' 

ли кто-то есть идея о том, как использовать его? Thanks

ответ

1

Проблема заключается в том, что шаблон шаблона (A) не сконструирован во время вызова A.B.a. То есть A еще не привязан к классу.

Попробуйте обходной путь:

class A(): 
    class B(): 
     a = 1 

Теперь создать C отдельно (A уже определен):

class C(): 
    b = 2 
    c = A.B.a + b 

И ссылка C из A:

A.C = C 

Это может быть возможно сделано через мета-кла но может быть и здесь.

+0

Я пытаюсь избежать создания отдельного класса, я пытаюсь придерживаться формирования вложенных классов. – Nikigv

0

Во время компиляции определение класса для класса A не является полным, поэтому вы не можете получить доступ к классам, переменным и методам, определенным в родительском классе внутри вложенного класса.

Вы можете попробовать отделить определения классов, как это было предложено @Reut Sharabani.

0

Вы не можете получить доступ к классу по его названию, в то время как оператор определения класса все еще выполняется.

class A(object): 
    class B(object): 
     a = 1 
    class C(object): 
     b = 2 
     c = A.B.a + b # here class A statement is still executed, there is no A class yet 

Для решения этой проблемы необходимо отложить выполнение этих заявлений:

  • движение на все эти заявления в виде classmethod
  • называть их после того, как классы были определены.

class A(object): 
    class B(object): 
     @classmethod 
     def init(cls): 
      cls.a = 1 
    class C(object): 
     @classmethod 
     def init(cls): 
      cls.b = 2 
      cls.c = A.B.a + cls.b 

    @classmethod 
    def init(cls): 
     cls.B.init() 
     cls.C.init() 

A.init() 
Смежные вопросы