2011-10-10 14 views

Odpowiedz

14

Nie możesz użyć gołego połączenia super(), które nie zawiera typu/klasy. Nie możesz też zastąpić tego, który będzie działał. Python 3.x zawiera specjalne wsparcie w celu umożliwienia gołe super() połączenia (umieszcza zmienną __class__ komórek we wszystkich funkcji zdefiniowanych w klasie - zobacz Pep 3135

+1

Dzięki. Byłem zdezorientowany, ponieważ wcześniejsza wersja tego dokumentu mówiła, że ​​zaimportujesz go z 'from __future__ import new_super', który nie działa. –

6

Nie, nie możesz. Ale możesz użyć Pythona 2: super() w Pythonie 3.

3

Uwaga To jest straszne „rozwiązanie”, ja tylko po to, aby ! upewnij ty nie robić tego w domu
powtarzam: nie rób tego

One mogą myśleć o użyciu tej mixin

class Super(object): 
    def super(self): 
     return super(self.__class__, self) 

do uzyskania self.super():

class A(object, Super): 
    def __init__(self): 
     print "A" 

class B(A): 
    def __init__(self): 
     print "B" 
     self.super().__init__() 

otrzymując:

>>> a = A() 
A 
>>> b = B() 
B 
A 

Ale uwaga: ten self.super() nie jest równoznaczne z super(B, self) - jeśli A zwany także self.super().__init__(), budowa B spowodowałoby konstruktor A, aby wywoływał się w nieskończoność, ponieważ self.__class__ pozostanie B . Wynika to z braku __class__ wspomnianego w accepted answer. Można obejść ten problem, korzystając z ukrytego automatu stanów lub zaawansowanego metaklasu, który np. sprawdza aktualną pozycję klasy w self.__class__.mro(), ale czy naprawdę jest tego warta? Prawdopodobnie nie ...

15

Zdaję sobie sprawę, że to pytanie jest stare, a wybrana odpowiedź mogła być prawidłowa, ale nie jest już kompletna. Nadal nie można używać super() w 2.5.6, ale python-future zapewnia back-ported implementation dla 2.6+:

% pip install future 
... 
% python 
... 
>>> import sys 
>>> sys.version_info[:3] 
(2, 7, 9) 
>>> from builtins import * 
>>> super 
<function newsuper at 0x000000010b4832e0> 
>>> super.__module__ 
'future.builtins.newsuper' 
>>> class Foo(object): 
... def f(self): 
... print('foo') 
... 
>>> class Bar(Foo): 
... def f(self): 
... super().f() # <- whoomp, there it is 
... print('bar') 
... 
>>> b = Bar() 
>>> b.f() 
foo 
bar 

Jeśli używasz pylint można wyłączyć starszych ostrzeżenia z komentarzem:

# pylint: disable=missing-super-argument 
+0

Fajna, dzięki :) –

Powiązane problemy