2016-06-30 27 views
0

Ich versuche, meinen Kopf rund um die Klassenvererbung zu wickeln, aber ich kann nicht herausfinden, wie man die self Werte von der Elternklasse in die Child-Klasse in einer intuitiven Weise erhält. Im Idealfall möchte ich ** kwargs verwenden, da ich möglicherweise zusätzliche Schlüsselwortvariablen zur Elternklasse hinzufügen muss.Klassenvererbung mit beliebiger Anzahl von ** kwargs?

class police_officer(object): 
    def __init__(self, name=None, age='40'): 
     self.name = name 
     self.age = age 

class police_chief(police_officer): 
    def __init__(self): 
     pass # What should put I here to inherit the __init__() values? 


new_officer = police_officer(name='Danny') 
chief = police_chief(new_officer) 

print(chief.name) 

ist meine einzige Option explizit jede Variable zu rufen, wenn ich die Chef instanziiert? (Beispiel):

chief = police_chief(name=new_officer.name, age=new_officer.age) 
+1

'police_chief (neuer_officer)' - nein, nein, nein. Sie erstellen kein Superklassenobjekt und erstellen dann ein Unterklassenobjekt um es herum. – user2357112

+0

Ich bin mir nicht sicher, wie man ein neues Objekt erstellt, das von der Elternklasse erbt, aber die gleichen Eigenwerte des Originalobjekts behält. Gibt es irgendeinen Weg? – Phil

+0

Sie erstellen kein "Originalobjekt". – user2357112

Antwort

3

In diesem Fall können Sie __init__ in police_chief ganz wegzulassen.

class police_chief(police_officer): 
    """A police officer who is chief.""" 

In einem allgemeineren Fall, in dem der Polizeichef eine zusätzliche Einrichtung in __init__ zu tun hat, dann würden Sie wahrscheinlich super verwenden:

class police_chief(police_officer): 
    def __init__(self, is_boss=True, **kwargs): 
     super(police_chief, self).__init__(**kwargs) 
     self.is_boss = is_boss 

Seien Sie ein wenig vorsichtig mit Super . There are some pitfalls.. Wenn Sie jedoch well established idioms folgen, sind Sie in Ordnung. Sie könnten es umgehen, indem Sie auch police_officer.__init__(self, **kwargs) tun.

wirklich das Problem ist nicht mit super (per se), es ist mehr ein Problem mit Mehrfachvererbung. Für die Einzelvererbung gibt es keine Fallstricke mit Super- und keine echten Unterschiede zwischen der Verwendung und dem direkten Aufruf der Superklassenmethode.


Wie Sie erwähnt haben, dass die Art und Weise Sie dann einen Polizeichef instanziiert würde, ist durch die Chefkonstrukteur police_officer Argumente an die Polizei übergeben:

chief = police_chief(name=new_officer.name, age=new_officer.age) 

Wenn Sie in der Lage sein wollen

class police_chief(police_officer): 
    @classmethod 
    def promote(cls, officer, **kwargs): # create_from_officer is probably a better name ... 
     return cls(
      name=officer.name, 
      age=officer.age, 
      **kwargs) 

Oder vielleicht umstrukturieren, um den Code zu verwenden, nicht inherita: einen Polizisten zu einem Chef fördern, würden Sie einen alternativen Konstruktor haben müssen überhaupt (und stattdessen eine Form der Komposition verwenden).

+1

Oder einfach 'super()' in Python3. Komm schon, Leute, es ist bereits CURRENTYEAR! – o11c

+0

Es ist wie ein großer Teil meines Problems scheint, ist, dass ich um Klassen übergeben kann nicht, wie ich dachte, ich könnte: new_officer = police_officer (name = ‚Danny‘) Chef = police_chief (new_officer) Wie kann ich selbst Attribut kopieren wie Name, wenn man einen Offizier zum Leiter fördert? – Phil

+0

@Phil - Sie tun es explizit. Sehen Sie sich meine letzten Änderungen an. – mgilson