8

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

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

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

我要做的不是重写__ init __ () 方法,而是创建一个具有属性symbolidentifier的 atom 实例。

像这样:

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

因此,一旦创建了 Atom 的实例,我希望能够访问 Atom.identifier 和 Atom.symbol。

我怎样才能做到这一点?

4

6 回答 6

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

从代码中的对象继承是个好主意。

于 2010-11-05T16:15:19.847 回答
6

您必须__init__手动调用超类的 - 方法。

class Atom(Node):
  def __init__(self, symbol, identifier)
    Node.__init__(self, identifier)
    self.symbol = symbol
于 2010-11-05T16:12:55.670 回答
3

创建类时,您需要在声明中使用 self 词。之后,您可以定义其他参数。继承调用 super 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
>>>
于 2010-11-05T16:18:29.083 回答
2

您的代码中缺少两件事:

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

  2. 您派生的“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
于 2010-11-05T16:17:09.940 回答
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

有关and的解释,请参见此处。通过使用,您可以访问 Atom 类的基类(超类)并将其称为. 此外,还需要包含参数。*args**kwargssuper__init__self

于 2010-11-05T16:13:36.227 回答
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

要点:

  • 节点应该继承自object.
  • 用于super调用父类的__init__函数。
  • 类成员函数self作为 Python 中的第一个参数。
于 2010-11-05T16:17:58.583 回答