1

たとえば、次のコードがあります。

class Dog:
    def bark(self):
        print "WOOF"

class BobyDog( Dog ):
    def bark( self ):
        print "WoOoOoF!!"

otherDog= Dog()
otherDog.bark() # WOOF

boby = BobyDog()
boby.bark() # WoOoOoF!!

BobyDog は Dog の子で、instancemethod "bark" をオーバーライドしています。

クラス「BobyDog」のインスタンスから親メソッド「bark」を参照するにはどうすればよいですか?

言い換えると:

class BobyDog( Dog ):
    def bark( self ):
        super.bark() # doesn't work
        print "WoOoOoF!!"

otherDog= Dog()
otherDog.bark() # WOOF

boby = BobyDog()
boby.bark()
# WOOF
# WoOoOoF!!
4

1 に答える 1

3

関数を呼び出しsuper()、現在のクラス ( BobyDog) とを渡す必要がありますself

class BobyDog( Dog ):
    def bark( self ):
        super(BobyDog, self).bark()
        print "WoOoOoF!!"

さらに重要なことは、新しいスタイルのクラスにするためにベースDogにする必要があることです。古いスタイルのクラスでは機能しません:objectsuper()

class Dog(object):
    def bark(self):
        print "WOOF"

これらの変更により、呼び出しが機能します。

>>> class Dog(object):
...     def bark(self):
...         print "WOOF"
... 
>>> class BobyDog( Dog ):
...     def bark( self ):
...         super(BobyDog, self).bark()
...         print "WoOoOoF!!"
... 
>>> BobyDog().bark()
WOOF
WoOoOoF!!

Python 3 では、古いスタイルのクラスが削除されました。すべてが新しいスタイルで、 からクラスとselfパラメーターを省略できますsuper()

古いスタイルのクラスでは、元のメソッドを呼び出す唯一の方法は、親クラスのバインドされていないメソッドを直接参照し、手動で次のように渡すことですself

class BobyDog( Dog ):
    def bark( self ):
        BobyDog.bark(self)
        print "WoOoOoF!!"
于 2013-10-24T15:02:54.343 に答える