2016-10-02 3 views
-1

kam ich mit einer Situation, in der die Methode der Klasse A aus der Klasse B.Wie das folgende Programm ist möglich in Python

class A(object): 
    def __init__(self, a): 
     self.a = a 

    def abc(self): 
     print self.a 

class B(A): 
    def __init__(self): 
     super(B, self).abc() 

def method1(): 
    a = A(2) 

method1() 
b = B() 

Expecting Output: 2 

Ist es möglich, nennen Methode ‚abc‘ aus der Klasse B aufgerufen werden, mit wechselnden Klasse A und sollte Klasse A-Objekt in Klasse B nicht erstellen. Wenn ja, dann lassen Sie mich bitte die Lösung wissen.

Das obige Programm, das ich versuchte, gibt einen Fehler.

Und die Fehler, die ich bekommen habe ist unter

Traceback (most recent call last): 
    File "a.py", line 12, in <module> 
     b = B() 
    File "a.py", line 10, in __init__ 
     super(B, self).abc() 
File "a.py", line 6, in abc 
    print self.a 
AttributeError: 'B' object has no attribute 'a' 
+8

Was erwarten Sie diese zu drucken, wenn man bedenkt 'a' nicht auf etwas initialisiert wird? – Karin

+1

'self.a' ist in' A's '__init __()' definiert. Da Sie "__init __()" in "B" außer Kraft setzen, ist "self.a" nicht in "B" definiert. – MattDMo

+1

Sie müssen 'super (A, self) .__ init __ (...)' aufrufen, um sicherzustellen, dass alle Attribute richtig gesetzt sind. – jonrsharpe

Antwort

2

Ihre B-Klasse __init__ Methode wird jedes Argument nicht nehmen, während der __init__ der Klasse A benötigen Sie einen (mit dem Namen „a“) ​​zu übergeben, und doch Sie liefern es nicht. Weder in Ihrer B-Klasse noch durch Übergabe an A.

Dies würde jedoch funktionieren.

class A(object): 
    def __init__(self, a): 
     self.a = a 

    def abc(self): 
     print self.a 

class B(A): 
    def __init__(self): 
     self.a = 10 
     super(B, self).abc() 

Oder:

class B(A): 
    def __init__(self): 
     super(B, self).__init__(10) 

inst = B() 
inst.abc() # 10 
0

hier:

class B(A): 
    def __init__(self): 
     super(B, self).abc() 

Der Konstruktor von A nie genannt wird, so dass die Initialisierung in A.__init__ getan fehlt. Es schlägt in print self.a fehl, weil es keine a gibt. Der Super-Konstruktor sollte aufgerufen werden.

Darüber hinaus ist super(B, self).abc() das gleiche wie self.abc().

Wenn es eine Methode namens abc in B definiert war, dann self.abc() würde das Verfahren von B nennen, während super(B, self).abc() die Methode von der übergeordneten Klasse nennen.

Also, da die gleich sind, würde ich nicht die hässliche verwenden. Es macht nur den Code weniger lesbar.

Mit diesen beiden Korrekturen:

class B(A): 
    def __init__(self): 
     super(B, self).__init__(1000) # whatever default value 
     self.abc() 
Verwandte Themen