「ぐへへお姉ちゃんパンツ何色」から始めるPythonクラス解説

はじめに

とりあえずこれを読みましょう。

http://b0r0nji.blogspot.com/2011/12/blog-post.html

Python

さて、ほむほむのパンツをPythonで実装するとこうなります。(ぽんこつさんはお姉ちゃんキャラ嫌いなのです)

class Pants(object):
    def __init__(self, color="#BCE2E8", type="shimapan"):
        self._color = color
        self._type = type

    @property
    def color(self):
        return self._color

    @property
    def type(self):
        return self._type

class Woman(object):
    def __init__(self):
        self.pants = Pants()

if __name__ == "__main__":
    homuhomu = Woman()
    print homuhomu.pants.type  # shimapan
    print homuhomu.pants.color # BCE2E8
    homuhomu.pants.color = "#000000" # Error!

今回はclassをWomanとPantsに分けました。パンツは別に男性でもはけますから再利用が効きますし、classは小さくすべきという考え方があるからです。
(Woman classらしくしたければ胸のサイズとか入れるといいかもしれませんが今回は入れていません。あとWomanはManクラスを継承するべきかもしれませんが今回はやってません!)

property

重要なのは元記事で中心になっているアクセス権限です。もし、Pantsクラスを

...
    self.color = color
    self.type = type
...

と書いてしまうと、

homuhomu = Woman()
homuhomu.pants.color = "#000000" # OK!

パンツの色を勝手に書き換えられてしまいます!

なので、_付きの変数名(_から始まる変数名は、Pythonの暗黙の了解事項として、アクセスしないことになってます)に代入し、アクセサを@propertyで定義します。

@propertyで宣言した関数はgetterとして振舞います。あたかも変数かのようにアクセスできますが、一方で書き込みはsetterを宣言しない限りできません。

この変数のようにアクセスできる点がC++と違っていてスマートですね!

C++と違って残念な点は、homuhomu.pants._color = "#000000"ができてしまう点ですが、常識あるPythonianはそんなことしませんよね)

Python3について補足

以上はPython2.xの話ですが、基本的にはPython3でも使えます。ただし、objectを継承する必要はないでしょう。