8
votes

Comprendre des objets en python

Je suis un peu confus par le modèle d'objet de Python. J'ai deux classes, on hérite de l'autre. XXX PRE>

Ce que j'essaie de faire est de ne pas remplacer le __ init em> __ strong> () Méthode, mais pour créer une instance d'atome qui aura des attributs symbole fort> et identifiant fort>. p>

comme ceci: p>

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


0 commentaires

6 Réponses :


6
votes

Vous devez appeler le __ init __ code> -method de la super-classe manuellement.

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


0 commentaires

1
votes
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
See here for an explanation of the *args and **kwargs. By using super, you can access the base class (superclass) of the Atom class and call it's __init__. Also, the self parameter needs to be included as well.

1 commentaires

C'est une bonne pratique d'invoquer la classe de base __ init __ méthode avant de faire toute autre initialisation, cependant.



7
votes
>>> 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'>
>>> 
It's a good idea to inherit from object in your code.

2 commentaires

@Santa Atom's __ init __ devrait passer des arguments supplémentaires qu'il obtient qu'il n'a pas besoin de la superclasse. Ajout du paramètre ID _ sur Atom's __ init __ enfreint le principe sec. Imaginez également d'ajouter des classes qui héritent également du nœud, à l'aide du paramètre ID _ et de la transmettre, et une classe de molécule qui hérite de l'atome (même si elle échoue techniquement le test "est un test". Maintenant, vous souhaitez ajouter un paramètre d'emplacement au nœud __ init __ et vous devez le modifier dans le __ init __ de nœud, le __ init __ de tout son Sous-classes, le __ init __ de toutes les sous-classes de ses sous-classes, etc.


@ user470379 Comme je l'ai dit, c'est une preuve de concept. Il n'y a pas besoin de sur-ingénieur.



2
votes

Vous avez deux choses manquantes dans votre code:

  1. Les méthodes appartenant à une classe doivent avoir un paramètre explicite auto , que vous manquez

  2. Votre classe «Atom» dérivée doit également accepter le paramètre qu'il doit utiliser pour initialiser la classe de base.

    quelque chose de plus comme: xxx


0 commentaires

1
votes
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
Points:
Node should inherit from object.
Use super to call parent classes' __init__ functions.
Class member functions take self as the first parameter in Python.

0 commentaires

3
votes

Lors de la création d'une classe, vous devez utiliser l'auto-mot dans la déclaration. Après cela, vous pouvez définir les autres arguments. Pour hériter d'appeler la méthode Super init : xxx


0 commentaires