「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。

MENU

Pythonをゆっくりていねいに学ぶ(その15/X)

 Pythonを真面目にゆっくり学ぶべく

を参考に学んでいきます*1

6. オブジェクトとクラス

6.5 メソッドのタイプ

 一部のデータ(属性)と関数(メソッド)はクラス事態の一部であり、それ以外のデータと関数がクラスから作られたオブジェクトの一部となっている。
 クラス定義の中でメソッドの第1引数が\mathrm{self}となっていたら、それは独自クラスを作る際に普通書くタイプのインスタンスメソッドである。
 これに対して暮らすメソッドは暮らし全体に影響を与える。クラス定義の中で@\mathrm{classmethod}というデコレータを入れると、その次の関数はクラスメソッドになる。メソッドの第1引数はクラス自体になる。伝統的にこの引数を\mathrm{cls}と呼ぶ。

# オブジェクトインスタンスが作られたかを数えるクラスメソッド
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 ダックタイピング

 \mathrm{Python}ポリモーフィズムの緩やかな実装を持つ。

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種類の\mathrm{says}()メソッドが3つの喰らうsのために異なる動作を提供する。これがオブジェクト指向言語の伝統的なポリモーフィズムである。\mathrm{Python}は更に\mathrm{who}(),\mathrm{says}()メソッドを持ちさえすればどのようなオブジェクトであっても共通のインターフェイスを持つオブジェクトとして扱うことができる。

*1:第2版が出ているものの初版しか持っていないのでこちらで。

プライバシーポリシー お問い合わせ