2010-11-05 22 views
7

Estoy un poco confundido por el modelo de objetos de Python. Tengo dos clases, una hereda de la otra.Entender objetos en Python

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

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

Lo que estoy tratando de hacer es no reemplazar el método __ __ init(), sino para crear una instancia de un átomo que tendrá atributos símbolo y identificador.

De esta manera:

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

Así quiero ser capaz de acceder Atom.identifier y Atom.symbol una vez que se crea una instancia de Atom.

¿Cómo puedo hacer eso?

Respuesta

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'> 
>>> 

Es una buena idea para Heredar del objeto en el código.

+0

+1 para heredar del objeto –

+0

No es muy fácil de mantener ... – user470379

+0

@ user470379 ¿Cuidar para elaborar? Esto es solo una prueba de concepto ... – Santa

6

Tiene que llamar al __init__ -metodo de la superclase de forma manual.

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 

Ver here para una explicación de la *args y **kwargs. Al usar super, puede acceder a la clase base (superclase) de la clase Atom y llamar al __init__. Además, también se debe incluir el parámetro self.

+0

Es una buena práctica para invocar la clase base '__init__' método antes de hacer cualquier otra inicialización, sin embargo. –

+0

Tienes razón, no estaba pensando. Fijo. – user470379

2

Usted tiene dos cosas que faltan en su código:

  1. métodos que pertenecen a una clase tiene que tener un self parámetro explícito, que se echa en falta

  2. su clase derivada 'Atom' también debe para aceptar el parámetro que necesita usar para inicializar la clase base.

Algo más como:

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 

Puntos:

  • nodo debe heredar de object.
  • Utilice super para llamar a las clases principales '__init__ funciones.
  • Las funciones miembro de clase toman self como el primer parámetro en Python.
3

Al crear una clase, necesita utilizar la palabra propia en la declaración. Después de eso puedes definir los otros argumentos.Para heredar llamar a la súper método 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 
>>>