Pythonの抽象スーパークラス

1226 ワード

次のコードを見てください.
# -*- coding:utf-8 -*-
class Super(object):
    
    def test(self):
        self.action()

class Sub(Super):
    
    def action(self):
        print "sub action"
        
obj=Sub()
obj.test()

コードでは、スーパークラスSuperで関数testが定義されています.独自のaction関数が呼び出されました.しかし,Superではaction関数は定義されていない.
これはなぜですか.
----------------------------------
この例のスーパークラスは,抽象スーパークラスと呼ばれることがある.クラスの一部の行為はサブクラスによって提供されるという意味である.予想されるメソッドがサブクラスに定義されていない場合、変数名が定義されていない例外が放出されます.
----------------------------------
これが上のコードの出力が
sub action
-------------------------------------
サブクラスがaction関数を実装することを忘れないように,Superクラスにaction関数を加え,assertを用いてユーザにこの関数を上書きしなければならないことを促すこともできる.
コードは次のとおりです.
class Super(object):
    
    def test(self):
        self.action()
    def action(self):
        assert False,"action must be implemented!"

もちろん,このヒントサブクラスがaction関数を上書きする機能をSuperで例外を投げ出す手法を用いて実現することも可能である.
コードは次のとおりです.
class Super(object):
    
    def test(self):
        self.action()
    def action(self):
        raise NotImplementedError("action must be implemented!")