#navi_header|Python| 新形式(objectから派生)のみ扱います。 * 基本例とisinstance(), self.__class__ 自分で作成するベースクラスは、objectから派生させます。 class S(object): def saySpam(self): print 'Spam' クラスSからもう一段派生させたクラスCを作成します。 class C(S): """ inheritance example. """ def sayHello(self, name): print 'Hello, %s.' % (name) S, Cのインスタンスを作り、軽く動かしてみます。 c = C() s = S() c.saySpam() # >>> "Spam" c.sayHello('FooBar') # >>> "Hello, FooBar." print C.__doc__ # >>> " inheritance example." c や s がクラスC, Sのインスタンスなのか真偽値で判定するコードは次の二種類があります。 パターン1: print s.__class__ is S # >>> True print s.__class__ is C # >>> Flase print c.__class__ is S # >>> False print c.__class__ is C # >>> True オブジェクトの特殊属性"__class__"には、そのクラスオブジェクトが入りますので、それで判定する手法です。 一方、isinstance(インスタンス, クラス)関数を使う方法もあります。こちらですとクラスの継承元も見に行ってくれます。 パターン2: print isinstance(s, S) # >>> True print isinstance(s, C) # >>> False print isinstance(c, S) # >>> True : クラスSはクラスCの基底クラスです。 print isinstance(c, C) # >>> True "__class__"特殊属性による判定は、 [[215]] の74Pに "Checking obj.__class__ is evil" とあり、推奨されていない模様です。 * 基底クラスの属性/メソッドのオーバーライド例 単純に、継承先のクラスで同じ属性/メソッドを定義すればそれでオーバーライドできます。 class S2(object): name = "Spam" def saySpam(self): print 'Spam' class C2(S2): name = "Bacon" def saySpam(self): print 'Bacon' c = C2() print c.name # >>> Bacon c.saySpam() # >>> Bacon #navi_footer|Python|