理解Python中的对象
我对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)
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
参数,您缺少该参数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
初始化函数
- 类成员函数将
作为Python中的第一个参数self
>>> 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
>>>