home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Python/codepiece/継承(1) (v1)

Python/codepiece/継承(1) (v1)

Python / codepiece / 継承(1) (v1)
id: 216 所有者: msakamoto-sf    作成日: 2009-03-21 19:37:27
カテゴリ: 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__"特殊属性による判定は、 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


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2009-03-21 19:49:22
md5:42cf857d2a6e109247db0de50020cfc9
sha1:141e8c2f4072dd2a815f31ab8aaa98f813a6b85f
コメント
コメントを投稿するにはログインして下さい。