8

重複の可能性:
super()を使用するときに自分のクラスを指定する必要があるのはなぜですか?それを回避する方法はありますか?

私はこの本を読んでいました-"Core Python Programming"そして、私はそれが私が言うだろうと本当にとても素晴らしいと思いました。しかし、「継承」というトピックを勉強しているときに、ある時点で混乱しました。

この本はどこかで、基本クラスのメソッドを見つけるために使用できると述べています。また、superなしの場合のように、明示的に渡す必要はありませsuper()ん。super class methodself

サンプルコードは次のとおりです。-

# Invoking super class method without super() .. Need to pass `self` as argument
class Child(Parent):
    def foo(self):
        Parent.foo(self)

# Invoking with super().
# No need to pass `self` as argument to foo()
class Child(Parent1, Parent2):
    def foo(self):
        super(Child, self).foo()
        print 'Hi, I am Child-foo()'

私の質問は、なぜ呼び出しを渡す必要があるのか​​ということclassnameですsuper()。クラス名は、superが呼び出されるクラスから推測できるためです。

したがって、super()はから呼び出されるため class Child、クラス名はそこに暗黙的に含まれている必要があります。では、なぜそれが必要なのですか?

*編集:Child-super()にパラメーターとして指定しても、情報が提供されないため、意味がありません。..を使用することもできますsuper(self)。また、メソッドは、スーパークラスで次の順序で検索されます。括弧内に記載されています。

4

1 に答える 1

5

最初の引数としてクラス名を指定することにより、冗長な情報を提供します。はい。これは少しばかげています*。そのため、Python3ではの動作superが変更されています。

*私の答えでは、実際にはジョン・カーターの答えと矛盾しています。もちろん、私たちの1人だけが正しいです。super(C, self).method(arg)私は彼や他の人を怒らせたくありません、そして私はクラス内で実際に使われていない意味のある例を見てうれしいですC:-)。

于 2012-09-25T13:46:21.963 に答える