1. ホーム
  2. python

[解決済み] なぜ、スーパークラスの __init__ メソッドは自動的に呼び出されないのですか?

2022-05-03 06:43:34

質問

Pythonの設計者はなぜ、サブクラスの __init__() メソッドを自動的に呼び出すことはありません。 __init__() 他の言語のように、そのスーパークラスのメソッドを使用するのですか?Pythonicで推奨されているイディオムは、本当に以下のようなものなのでしょうか?

class Superclass(object):
    def __init__(self):
        print 'Do something'

class Subclass(Superclass):
    def __init__(self):
        super(Subclass, self).__init__()
        print 'Do something else'

解決方法は?

Pythonの肝心の __init__ と他の言語 コンストラクタ は、その __init__ ではない はコンストラクタです。 イニシャライザー (実際の コンストラクタ (もしあればですが、後述;-)は __new__ で、また全く違う動作をする)。 一方 を構築する すべてのスーパークラス(そして、間違いなく、下に向かって構築を続ける前にそうすること)は、明らかに、あなたが コンストラクション の場合、サブクラスのインスタンスであることは明らかです。 初期化 というのも、スーパークラスの初期化をスキップしたり、変更したり、制御したりする必要がある多くのユースケースがあり、もし可能であれば、サブクラスの初期化の途中で行われたりするからです。

基本的に、Pythonではイニシャライザのスーパークラスへの委譲は自動的ではありません。 任意の そして、それらの "他の言語" は、他のどのメソッドに対しても自動的なスーパークラス委譲を行わないということに注意してください...。 ちょうど は、コンストラクタ(および該当する場合はデストラクタ)であり、これは、私が述べたように ではなく Pythonの __init__ があります。 (動作の __new__ もかなり特殊で、質問とは直接関係ないのですが、なぜなら __new__ はこのように特殊なコンストラクタで、実際には必ずしも何かを構築する必要はありません -- 既存のインスタンスや、非インスタンスを返すことも十分に可能です。 ロット あなたが考えているような他の言語よりも、力学的な制御が可能で、それは また での自動委譲がないことも含まれます。 __new__ そのものです!-)。