私は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オブジェクトシステムの実装をどのように見ているかです。オブジェクトは単なる変数の集まりであり、メソッドは別の場所にあります。メソッドが特定のオブジェクトに対して何らかの作業を行うために、すべてのメソッドで「self」を渡します。(これが完全に真実でない場合は、私を訂正してください)
しかし、私はこれを理解していません:
LogicGate.__init__(self, n)
ここで何が起こっているのか説明してもらえますか?私はPython2.7を使用しています
すべてのPythonメソッドは、実際には「単なる関数」です。でも特別な方法、のような__init__
実際には二つのパラメータ受け入れるだけの正常な機能、ある- self
(actualy任意の名前を持つことができます-self
唯一の大会である)とn
。
インスタンスを作成すると、Pythonはインスタンスを作成し、それを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__
。
super(BinaryGate, self).__init__(n)
これは、プローバーの親クラスを呼び出すことを確認するだけなので、のように変更した場合、親の呼び出しも変更するSuperLogicGate
必要はありませ__init__
ん。
おそらくこれも読む必要があります:https://docs.python.org/2/tutorial/classes.html?highlight = class%20inheritance
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加