2016-07-09 5 views
0

Ich kodiere die Dynamik eines Spiels. Es gibt zwei Arten von Sperren im Spiel, Blöcke und Bälle, die geschoben werden können. Ich möchte, dass Bälle rollen, wenn sie geschoben werden.So lassen Sie Subclass-Methoden der Super-Klasse in Python

Also schrieb ich den folgenden Code:

class Barrier: 
    def __move(self): 
     print 'Moving' 

    def push(self): 
     if self.canMove(): 
      self.__move() 
     else: 
      pass # Push barriers in front of it 

    def canMove(self): 
     return True 

class Ball(Barrier): 
    def __move(self): 
     self.__startRolling() 
     super(Ball, self).__move() 

    def __startRolling(self): 
     print 'Started rolling' 

class Block(Barrier): 
    # bla bla bla 
    pass 

Wenn push() genannt wird, Klasse Barrier prüft, ob es (andere Hindernisse vor ihm es eine Bewegung verhindern kann) bewegen kann, und dann self.__move() nennen. Für die Klasse Ball überschreibt sie diese Methode und beginnt mit dem Rollen, bevor sie verschoben wird.

Es gibt zwei Probleme. Erstens, wenn ich lief den folgenden Code:

ball = Ball() 
ball.push() 

Ich habe gerade Moving auf dem Bildschirm, aber keine Started rolling. lief

Zweitens, wenn ich:

ball = Ball() 
ball._Ball__move() 

Ich habe:

Traceback (most recent call last): 
    File "F:\project\test.py", line 25, in <module> 
    ball._Ball__move() 
    File "F:\project\test.py", line 15, in __move 
    super(Ball, self).__move() 
TypeError: must be type, not classobj 

Wie mein Ziel verwirklichen kann?

+0

Ich löste das erste Problem, indem ich 'def __move' in' defmove' in der Klasse 'Ball' änderte. Aber ich weiß immer noch nicht, wie ich das zweite Problem lösen soll, und ich muss die 'move'-Funktion in der Klasse' Barrier' anders benennen (z. B. '_Barrier__move'), um sie aufzurufen. Auf diese Weise muss ich auch die "move" -Funktion in der Klasse "Block" implementieren, aber ich möchte, dass sie nur die "move" -Funktion von der Klasse "Barrier" erbt. – LouYu

Antwort

1

Das Problem, auf das Sie stoßen, ist auf zwei führende Unterstriche in __move() zurückzuführen. Dies führt zu Namensfehlern.

Im ersten Fall Ihren Anruf Barrier.__move() abgesendet wird statt Ball.__move() weil außerhalb der Kugel Klasse Ball.__move() ist nur als _Ball__move() zur Verfügung, die eindeutig nicht von Barrier.push() aufgerufen wird.

Im zweiten Fall, ich habe:

AttributeError: 'super' object has no attribute '_Ball__move' 

die wieder-Mangeln Namen aufgrund ist. super() wird kein _Ball__move() Attribut haben.

Um Ihr Ziel zu erreichen, können Sie die beiden führenden Unterstriche entfernen.

PEP-8: Um Namenskonflikte mit Unterklassen zu vermeiden, verwenden Sie zwei führende Unterstriche, um die Namensmangelregeln von Python aufzurufen.

+0

Sie haben einen kleinen Tippfehler: '_Ball .__ move()'. Extra-Punkt drin. Vielleicht ist es auch erwähnenswert, dass, wenn das OP direkte Aufrufe der Methode durch Code unter Verwendung der Klassen verhindern möchte, stattdessen einen einzelnen Unterstrich verwenden können. – jpmc26

Verwandte Themen