2010-11-05 11 views
7

Sono un po 'confuso dal modello a oggetti di Python. Ho due classi, una eredita dall'altra.Capire gli oggetti in Python

class Node(): 
    def __init__(identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(symbol) 
    self.symbol = symbol 

Quello che sto cercando di fare è di non eseguire l'override del metodo di __ init __(), ma di creare un'istanza di atomo che avrà gli attributi simbolo e identificatore.

Ti piace questa:

Atom("Fe", 1) # will create an atom with symbol "Fe" and identifier "1" 

Così Voglio essere in grado di accedere Atom.identifier e Atom.symbol una volta creato un'istanza di Atom.

Come posso farlo?

risposta

7
>>> class Node(object): 
...  def __init__(self, id_): 
...    self.id_ = id_ 
... 
>>> class Atom(Node): 
...  def __init__(self, symbol, id_): 
...    super(Atom, self).__init__(id_) 
...    self.symbol = symbol 
... 
>>> a = Atom("FE", 1) 
>>> a.symbol 
'FE' 
>>> a.id_ 
1 
>>> type(a) 
<class '__main__.Atom'> 
>>> 

E 'una buona idea quella di ereditare dall'oggetto nel codice.

+0

+1 per ereditare dall'oggetto –

+0

Non molto mantenibile ... – user470379

+0

@ user470379 Cura da elaborare? Questo è solo un proof-of-concept ... – Santa

6

È necessario chiamare manualmente il metodo __init__ della super-classe.

class Atom(Node): 
    def __init__(self, symbol, identifier) 
    Node.__init__(self, identifier) 
    self.symbol = symbol 
1
class Node(): 
    def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(self, symbol, *args, **kwargs) 
    super(Atom, self).__init__(*args, **kwargs) 
    self.symbol = symbol 

Vedi here per una spiegazione del *args e **kwargs. Utilizzando super, è possibile accedere alla classe base (superclasse) della classe Atom e chiamarla __init__. Inoltre, è necessario includere anche il parametro self.

+0

E 'buona pratica per richiamare la classe base '__init__' metodo prima di fare qualsiasi altra inizializzazione, però. –

+0

Hai ragione, non stava pensando. Fisso. – user470379

2

Avete due cose mancanti nel codice:

  1. metodi appartenenti ad una classe di avere un self parametro esplicito, che non trovi il

  2. tua classe derivata 'Atomo' ha anche bisogno per accettare il parametro che deve utilizzare per inizializzare la classe base.

qualcosa di più simile:

class Node(): 
    def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(self, identifier, symbol) 
    Node.__init__(self, identifier) 
    self.symbol = symbol 
1
class Node(object): 
    def __init__(self, identifier): 
    self.identifier = identifier 

class Atom(Node): 
    def __init__(self, symbol, *args, **kwargs) 
    super(Atom, self).__init__(*args, **kwargs) 
    self.symbol = symbol 

Punti:

  • nodo dovrebbe ereditare da object.
  • Utilizzare super per chiamare le funzioni __init__ delle classi parent.
  • Le funzioni membro della classe prendono self come primo parametro in Python.
3

Durante la creazione di una classe è necessario utilizzare la parola auto nella dichiarazione. Successivamente è possibile definire gli altri argomenti.Per ereditare chiamare il super metodo init :

>>> class Node(): 
... def __init__(self, identifier): 
...  self.identifier = identifier 
... 
>>> 
>>> class Atom(Node): 
... def __init__(self, symbol, identifier): 
...  Node.__init__(self, identifier) 
...  self.symbol = symbol 
... 
>>> 
>>> 
>>> fe = Atom("Fe", 1) 
>>> fe.symbol 
'Fe' 
>>> fe.identifier 
1 
>>>