Pythonを真面目にゆっくり学ぶべく
を参考に学んでいきます*1。
6. オブジェクトとクラス
6.5 メソッドのタイプ
一部のデータ(属性)と関数(メソッド)はクラス事態の一部であり、それ以外のデータと関数がクラスから作られたオブジェクトの一部となっている。
クラス定義の中でメソッドの第1引数がとなっていたら、それは独自クラスを作る際に普通書くタイプのインスタンスメソッドである。
これに対して暮らすメソッドは暮らし全体に影響を与える。クラス定義の中で@というデコレータを入れると、その次の関数はクラスメソッドになる。メソッドの第1引数はクラス自体になる。伝統的にこの引数を
と呼ぶ。
# オブジェクトインスタンスが作られたかを数えるクラスメソッド class A(): count = 0 def __init__(self): A.count += 1 def exclaim(self): print("I'm an A!") @classmethod def kids(cls): print("A has", cls.count, "little objects.") easy_a = A() breezy_a = A() wheezy_a = A() A.kids()
6.6 ダックタイピング
はポリモーフィズムの緩やかな実装を持つ。
class Quote(): def __init__(self, person, words): self.person = person self.words = words def who(self): return self.person def says(self): return self.words + '.' class QuestionQuote(Quote): def says(self): return self.words + '.' class ExclamationQuote(Quote): def says(self): return self.words + '.' hunter = Quote('Elmer Fudd', "I'm hunting wabbits") print(hunter.who(), 'says:',hunter.says()) hunted1 = QuestionQuote('Bugs Bunny', "What's up, doc") print(hunted1.who(), 'says:',hunted1.says()) hunted2 = ExclamationQuote('Daffy Duck', "It's a rabbit season") print(hunted2.who(), 'says:',hunted2.says())
異なる3種類のメソッドが3つの喰らうsのために異なる動作を提供する。これがオブジェクト指向言語の伝統的なポリモーフィズムである。
は更に
メソッドを持ちさえすればどのようなオブジェクトであっても共通のインターフェイスを持つオブジェクトとして扱うことができる。
*1:第2版が出ているものの初版しか持っていないのでこちらで。