理解Python中的对象

理解Python中的对象,python,object,object-model,Python,Object,Object Model,我对Python的对象模型有点困惑。我有两个类,一个继承自另一个 class Node(): def __init__(identifier): self.identifier = identifier class Atom(Node): def __init__(symbol) self.symbol = symbol 我试图做的不是重写\uuu init\uuu()方法,而是创建一个atom实例,该实例将具有属性符号和标识符 像这样: Atom("Fe", 1)

我对Python的对象模型有点困惑。我有两个类,一个继承自另一个

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

class Atom(Node):
  def __init__(symbol)
    self.symbol = symbol
我试图做的不是重写\uuu init\uuu()方法,而是创建一个atom实例,该实例将具有属性符号和标识符

像这样:

Atom("Fe", 1) # will create an atom with symbol "Fe" and identifier "1"
因此,我希望在创建Atom实例后能够访问Atom.identifier和Atom.symbol


我该怎么做呢?

您必须手动调用超类的
\uuuu init\uuuu
-方法

class Atom(Node):
  def __init__(self, symbol, identifier)
    Node.__init__(self, identifier)
    self.symbol = symbol
有关
*args
**kwargs
的说明,请参阅。通过使用,您可以访问Atom类的基类(超类)并调用它的
\uuuu init\uuuu
。此外,还需要包括
self
参数。

>>类节点(对象):
>>> 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'>
>>> 
... 定义初始化(self,id): ... self.id=id_ ... >>>类原子(节点): ... 定义初始化(自我、符号、id): ... 超级(原子,自我).\uuuu初始(id) ... self.symbol=symbol ... >>>a=原子(“FE”,1) >>>a.符号 “FE” >>>身份证_ 1. >>>类型(a) >>>

在代码中继承对象是一个好主意。

代码中缺少两件东西:

  • 属于某个类的方法必须有一个显式的
    self
    参数,您缺少该参数

  • 派生的“Atom”类还需要接受初始化基类所需的参数

  • 更像是:

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

    • 节点应继承自
      对象
    • 使用
      super
      调用父类的
      初始化函数
    • 类成员函数将
      self
      作为Python中的第一个参数

    创建类时,需要在声明中使用self单词。之后,您可以定义其他参数。要继承调用superinit方法:

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

    不过,在执行任何其他初始化之前调用基类
    \uuuuu init\uuuu
    方法是一种很好的做法。@Santa Atom的
    \uuuuuu init\uuu
    应该将它不需要的任何额外参数传递给它的超类。将
    id_
    参数添加到Atom的
    \uuuu init\uuu
    违反了DRY原则。想象一下,使用
    id\uu
    参数并向上传递它,添加更多从节点继承的类,以及从Atom继承的分子类(即使它在技术上未能通过“is a”测试)。现在,您需要将位置参数添加到节点
    \uuuuu init\uuuu
    ,并且必须在节点的
    \uuuuuu init\uuuu
    中更改它,所有子类的
    \uuuuu init\uuuuu
    及其子类的所有子类的
    \uuuuu init\uuuu
    ,etc@user470379就像我说的,这是概念的证明。没有必要过度设计它。
    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
    
    >>> 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
    >>>