Je suis un peu confus par le modèle d'objet de Python. J'ai deux classes, on hérite de l'autre. 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 comme ceci: p> Atom("Fe", 1) # will create an atom with symbol "Fe" and identifier "1"
6 Réponses :
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
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.
C'est une bonne pratique d'invoquer la classe de base __ init __ code> méthode avant de faire toute autre initialisation, cependant.
>>> 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.
@Santa Atom's __ init __ code> devrait passer des arguments supplémentaires qu'il obtient qu'il n'a pas besoin de la superclasse. Ajout du paramètre ID _ code> sur Atom's __ init __ code> enfreint le principe sec. Imaginez également d'ajouter des classes qui héritent également du nœud, à l'aide du paramètre ID _ code> 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 __ code> et vous devez le modifier dans le __ init __ code> de nœud, le __ init __ code> de tout son Sous-classes, le __ init __ code> 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.
Vous avez deux choses manquantes dans votre code:
Les méthodes appartenant à une classe doivent avoir un paramètre explicite Votre classe «Atom» dérivée doit également accepter le paramètre qu'il doit utiliser pour initialiser la classe de base. P> li>
ol> quelque chose de plus comme: p> auto code>, que vous manquez p> li>
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.
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