2017-10-23 1 views
-1

Was sind die wichtigsten Fragen, die ich stoßen kann, wenn ich Class über Vererbung in Python zu verwenden, wählen? Ein (dumme) Beispiel wäre:Fragen des Class über Vererbung in Python Auswahl

class Pizza(object): 
    def __init__(self, ingredients): 
     self.ingredients = ingredients 
     self.cooked = False 

    def cook(self):   
     print "cooking" 
     self.cooked = True 

    # A pepperoni pizza using a factory method 
    @classmethod 
    def Pepperoni(cls): 
     return cls("pepperoni") 

# An onion pizza inheriting from Pizza base class 
class Onion(Pizza): 
    def __init__(self): 
     ingredient = "onion" 
     super(Onion, self).__init__(ingredient) 

Ich weiß, dass

  • Ich kann nicht (leicht) benutzerdefinierte Methoden zu Pepperoni
  • hinzufügen kann ich nicht machen Pizza eine abstrakte Basisklasse

noch etwas?

+0

Ist nicht Pizza nur ein paar Zutaten darüber, warum sollte es in erster Linie * abstrakt * sein? Was würde eine Pepperoni-Pizza anders machen als eine Zwiebelpizza oder eine Zwiebelpizza mit zusätzlichen Peperoni ?! –

+0

, d. H. Klassenmethoden vs Vererbung dienen * vollständig * verschiedenen Zwecken. –

+0

Geh bitte zu technischen auf Pizzas bitte, es ist nur ein Beispiel –

Antwort

1

Sie scheinen an Pepperoni als eine Klasse an sich zu denken, genau wie Onion. Während Onion eine Klasse ist, ist Pepperoni nur eine Funktion, die auf Pizza lebt. Sicher sollte man nicht an Pepperoni als eine normale Methode denken, aber wirklich ist es. Der Dekorateur classmethod verwandelt die Methode Pepperoni effektiv in eine Factory-Funktion und erzeugt eine neue Instanz. Der Code ist völlig gleichwertig nur die Funktion außerhalb der Klasse zu schreiben:

def Pepperoni(): 
    return Pizza("pepperoni") 

Sie würden nicht über „das Hinzufügen von benutzerdefinierten Methoden Pepperoni“ jetzt sprechen, aber eigentlich hat sich nichts geändert.

+0

Ja, ich verstehe den Unterschied zwischen ihnen, aber ich habe eine Schwer zu versuchen, zu entscheiden, ob ich Vererbung oder nur Klassenmethoden verwenden soll. Stellen Sie sich vor, Sie müssen * Pizza * für einen Laden codieren, der 30 verschiedene Arten hat, was würden Sie tun? –

+0

Ich würde einfach das 'Zutaten'-Argument von' Pizza' verwenden: 'pizza_with_onion = Pizza ('Zwiebel')'. Die Factory-Funktion sollte verwendet werden, wenn Sie eine Pizza aus etwas anderem als ihren Zutaten irgendwie instanziieren müssen. Eine ganz neue Klasse wäre nötig, wenn Sie sich auch für Kebabs entscheiden würden, was sich von einer Pizza unterscheidet, aber vielleicht noch einige Methoden teilt. –

+0

Danke Kumpel! Ich schätze, ich mache eine Fabrikklasse, obwohl ich keine Pizza aus etwas anderem als ihren Zutaten herstellen muss * macht keinen Schaden =) –