新形式(objectから派生)のみ扱います。
自分で作成するベースクラスは、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__"特殊属性による判定は、 Effective Python Programming の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
コメント