2016-04-01 14 views
0

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, die __init__ Methode in einer Python-Klasse zu überschreiben. Ich habe mir das ausgedacht, nicht genau das Überschreiben, aber es hat die gleiche WirkungKonstruktor und Methode überschreiben in Python

class A(): 
    def __init__(self, x): 
     if isinstance(x, str): 
      print "calling some text parsing method" 
     elif isinstance(x, int): 
      print "calling some number crunching method" 
     else: 
      print "Oops" 

Ist das bitte gute Praxis? Nicht nur für Konstruktoren wie in dieser speziellen Frage, sondern auch für andere Methoden

Antwort

1

Das ist im Wesentlichen, was Sie tun müssen, wenn sich die Aktionen für ein String-Argument stark von den Aktionen für ein Integer-Argument unterscheiden. Wenn jedoch ein Fall auf den anderen Fall reduziert wird, können Sie eine Klassenmethode als alternativen Konstruktor definieren. Als einfaches Beispiel betrachtet

class A(): 
    def __init__(self, x): 
     if isinstance(x, str): 
      self.x = int(x) 
     elif isinstance(x, int): 
      self.x = x 
     else: 
      raise ValueError("Cannot turn %s into an int" % (x,)) 

Hier ist der ganze Zahl Fall die „fundamental“ Art und Weise ist eine Instanz von A zu schaffen; Der String-Fall wird reduziert, indem die Zeichenfolge in eine Ganzzahl umgewandelt wird, und dann wird wie im Fall der Ganzzahl verfahren. Sie könnten dies umschreiben als

class A(): 
    # x is expected to be an integer 
    def __init__(self, x): 
     self.x = x 

    # x is expected to be a string 
    @classmethod 
    def from_string(cls, x): 
     try: 
      return cls(int(x)) 
     except ValueError: 
      # This doesn't really do anything except reword the exception; just an example 
      raise ValueError("Cannot turn %s into an int" % (x,)) 

In der Regel wollen Sie für den Typ eines Wertes zu vermeiden, überprüft, weil Typen weniger wichtig sind als Verhalten. Zum Beispiel erwartet from_string oben nicht wirklich eine Zeichenfolge; es erwartet nur etwas, das in eine int umgewandelt werden kann. Das könnte ein str oder ein float sein.