我是Python语言的新手,我对继承有疑问。
假设这是我的代码:
class LogicGate(object):
def __init__(self, n):
self.label = n
self.output = None
def get_label(self):
return self.label
def get_output(self):
self.output = self.perform_gate_logic()
return self.output
class BinaryGate(LogicGate):
def __init__(self, n):
LogicGate.__init__(self, n)
self.pinA = None
self.pinB = None
这就是我如何看待python对象系统的实现。对象只是一堆变量,方法生活在其他地方。为了让方法对特定的对象做一些工作,我通过了自己的方法。在每种方法中。 (如果这完全不正确,请纠正我)
但是,我不明白这一点:
LogicGate.__init__(self, n)
你可以解释一下这里会发生什么吗?我使用的是python 2.7
答案 0 :(得分:2)
所有python方法实际上都是“只是函数”。甚至像__init__
这样的特殊方法实际上只是一个普通函数,它接受两个参数 - self
(实际上可以有任何名称 - self
只是一个约定)和{{1} }。
创建实例时,python会创建实例并将其n
自动传递给self
方法。因此,例如,您可以手动创建__init__
实例:
LogicGate
如果要从父类进行初始化,则必须调用其>>> x = object.__new__(LogicGate)
>>> x
<__main__.LogicGate object at 0x7f12b2ea49d0>
# This won't work, because x instance is not initialized
>>> x.label
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'LogicGate' object has no attribute 'label'
>>> LogicGate.__init__(x, 'foo')
>>> x.label
'foo'
- 这是__init__
实际执行的内容。它只是调用LogicGate.__init__(self, n)
类的__init__
方法,并将您的实例作为第一个参数。
编辑:您应该使用方法解析顺序,而不是直接调用父级LogicGate
,即:
__init__
这只是确保它会调用prober父类,所以如果你将它改为super(BinaryGate, self).__init__(n)
,你也不必将调用更改为父SuperLogicGate
。
您可能还应该阅读:https://docs.python.org/2/tutorial/classes.html?highlight=class%20inheritance