2013-04-25 3 views
0

Что такое Неправильный со следующим кодом?Python: вложенный класс со статическим методом не работает

class A: 
    def A_M(self): pass 
    class B: 
     @staticmethod 
     def C(): super(B).A_M() 

ошибка (Python 2.7.3):

>>> a = A() 
>>> a.B.C() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "..x.py", line 36, in C 
    def C(): super(B).A_M() 
NameError: global name 'B' is not defined 

Edit:
решение было простым, как это:

class A: 
    def A_M(self): pass 
    class B: 
     @staticmethod 
     def C(): A().A_M()     #use of A() instead of supper, etc. 

Важное примечание, что есть вопрос с этим решением. Если вы измените имя суперкласса (т. Е. A), вам придется обновлять все виды использования внутри себя как A :)).

+0

Почему вы думаете, что хотите вложенный класс? В Python почти нет причин для этого. –

+0

_ «Если вы измените имя суперкласса (то есть A), вам придется обновлять все виды использования внутри себя как« _ - ** Это не то, что означает _super class_ ** – Eric

ответ

3
class A(object): 
    def foo(self): 
     print('foo') 

    @staticmethod 
    def bar(): 
     print('bar') 

    class B(object): 
     @staticmethod 
     def bar(obj): 
      # A.foo is not staticmethod, you can't use A.foo(), 
      # you need an instance. 
      # You also can't use super here to get A, 
      # because B is not subclass of A. 
      obj.foo() 
      A.foo(obj) # the same as obj.foo() 

      # A.bar is static, you can use it without an object. 
      A.bar() 

class B(A): 
    def foo(self): 
     # Again, B.foo shouldn't be a staticmethod, because A.foo isn't. 
     super(B, self).foo() 

    @staticmethod 
    def bar(): 
     # You have to use super(type, type) if you don't have an instance. 
     super(B, B).bar() 


a, b = A(), B() 

a.B.bar(a) 
b.foo() 
B.bar() 

См this подробную информацию о super(B, B).

+0

решение поэтому: 'класс А: Защиту A_M (само): пройти Класс B: @staticmethod четкости С():.. А() A_M()' ' – Developer

2

Вам необходимо использовать полное имя. Кроме того, в Python 2.7, вам нужно использовать (object), иначе super(A.B) даст TypeError: must be type, not classobj

class A(object): 
    def A_M(self): 
     pass 

    class B(object): 
     @staticmethod 
     def C(): 
      super(A.B).A_M() 

Наконец, super(A.B) существу object здесь. Возможно, вы имели в виду: B для получения наград от A? Или вы просто искали A.A_M()?

+0

не работает: ... ошибка : 'def C(): super (AB) .A_M() ТипError: должен быть тип, а не classobj' – Developer

+0

@Developer: Хорошо, теперь снова прочитайте мой пост: _« Кроме того, в python 2.7 вам нужно использовать (объект) "_. 'super' работает только в классах нового стиля – Eric

+0

все еще не работает: ... err:' super (AB) .A_M() AttributeError: объект 'super' не имеет атрибута 'A_M'' – Developer

2

latecommer, просто инкапсулировать В в простой способ заключается в следующем:

class A: 
    def A_M(self): 
     return "hi" 

    class B: 
     @staticmethod 
     def C(): 
      return A().A_M() 

a = A() 
print a.B().C() 

Не уверен, что это то, что вам нужно, но вопрос все еще не решена, так что я угадал.

+0

ав() С()' является не верно. 'a.B.C()' правильно (потому что C статичен в B). Я проголосовал за ваш ответ, кстати. Ответ 'gatto' говорит то же самое, но немного длинный. – Developer

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