「ぐへへお姉ちゃんパンツ何色」から始めるPythonクラス解説
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を継承する必要はないでしょう。