2017-03-27 5 views
0

Ich versuche, Methode innerhalb einer Klasse aufzurufen; dieser Anruf ist die letzte Zeile self.z()Aufruf Methode innerhalb der Klasse in Python

class Wait: 
    def __init__(self,a): 
      self.a = a 
    def countdown(self,a): 
     for remaining in range(self.a, 0, -1): 
      sys.stdout.write("\r") 
      sys.stdout.write("{:2d} seconds remaining.".format(remaining)) 
      sys.stdout.flush() 
      time.sleep(1) 
     sys.stdout.write("\rWait Complete!   \n") 
    def z(self): 
     self.countdown(100) 
    self.z() 

jedoch unten, ich diesen Fehler:

Traceback (most recent call last): 
    File "./countdown.py", line 6, in <module> 
    class Wait: 
    File "./countdown.py", line 18, in Wait 
    self.z() 
NameError: name 'self' is not defined 

Wie kann ich countdown von einer anderen Methode in dieser Klasse nennen?

+0

Möchten Sie 'self.z()' sofort bei der Objekt-Erstellung auslösen? – castis

+1

'self.z()' das funktioniert nur innerhalb einer Instanzmethode der Klasse. Was willst du erreichen? –

+1

Muss das überhaupt eine Klasse sein? Was ist falsch daran, Countdown als eigenständige Funktion zu verwenden? – Kevin

Antwort

2

Das Problem ist, dass self nicht im Klassenkörper definiert ist; self ist ein Parameter für jede der Methoden, aber Sie befinden sich an keiner Stelle in einer Methode. Ich glaube, Sie könnten versuchen, dies zu testen mit einem 100-Sekunden-Countdown, was bedeutet, dass Sie brauchen, dass Boden Code in Ihrem Hauptprogramm:

class Wait: 
    def __init__(self,a): 
      self.a = a 
    def countdown(self,a): 
     for remaining in range(self.a, 0, -1): 
      sys.stdout.write("\r") 
      sys.stdout.write("{0:2d} seconds remaining.".format(remaining)) 
      sys.stdout.flush() 
      time.sleep(1) 
     sys.stdout.write("\rWait Complete!   \n") 
    def z(self): 
     self.countdown(100) 

ticker = Wait(10) 
ticker.z() 

Beachten Sie, dass Ihr Code den in gesendet Wert ignoriert von z, anstatt den bei der Erstellung eingestellten Timer-Wert zu verwenden. Beachten Sie auch, dass ich Ihre formatierte Ausgabeanweisung korrigiert habe.

Können Sie es von hier aus nehmen?

+0

Nicht genau das, was ich wollte. Wie bereits erwähnt, möchte ich keine andere Klasse für countdown/wait verwenden. Ich möchte Countdown-Methode in der gleichen Klasse verwenden, was ich derzeit Klasse ABC sagen, so dass ich es innerhalb anderer Methoden der Klasse ABC verwenden kann. Nehmen wir an, def z möchte einen cli "abcd" ausführen und möchte 100 Sekunden warten. –

+0

Dann klären Sie bitte Ihre Frage und zeigen Sie vielleicht einen fehlgeschlagenen Versuch mit Klasse ABC. Ihr Beitrag gibt alle Methoden als innerhalb von ** Wait ** an, und meine Antwort behält dies bei. Ihr Fehler besteht darin, aktiven Code in den Rumpf einer * Klasse * zu setzen und zu versuchen, eine Variable zu verwenden, die auf dieser Ebene nicht definiert ist. – Prune

+0

Beachten Sie auch, dass ich * Ihre * Frage beantwortet habe: Ihre Countdown-Methode ist in der Tat innerhalb der Klasse aufrufbar. Ihr Aufruf von ** z ** ist illegal, aber ** z ** invoke ** countdown ** ist bereits korrekt. – Prune

Verwandte Themen