Pythonのクラス定義について
基本
定義・継承
クラスの宣言では class クラス名(継承元のクラス名): になります。
class Test(object): pass # 何もしない test = Test()すべてのクラスは object を基底として継承します。
クラス属性
クラス属性は、クラスで共有される属性です。
class Test: level = 3 def __init__(self, options): self.options = optionsこのように定義されている場合、インスタンスを複数作成すると、level = 3 は共有され、 あるインスタンスで level = 4 にすると、他のインスタンスにも反映されます。
メソッド
メソッドの第一引数は必ず self になります。
class Test: def __init(self): self.total = 0 def add(self, x): self.total += x def get_total(self): return self.total test = Test() test.add(2) test.add(3) print test.get_total() #=> 5
注意. 上記のサンプルで、以下のようにget_tatalメソッドをカッコ無しで呼び出すと、
print test.get_totalself.totalの値を表示せずに、以下のようなメソッドの情報を表示します。
<bound method Test.get_total of <__main__.Test object at 0x00BB0CB0>>
特殊メソッド
プログラムの内部イベントでフックされる特殊メソッドがあります。 特殊メソッドの名前は、メソッド名の先頭と最後にアンダースコア2個が 付いた、__XXX__の形式になります。
コンストラクタ
コンストラクタは __init__ になります。
class Test: def __init__(self, options): self.options = options
プロパティ
プロパティは property関数を使用して、以下のように設定します。
class Test(object): def _get_color(self): return tuple(v * 255.0 for v in self._rgh) def _set_color(self, rgh): self._rgh = tuple(v / 255.0 for v in rgh) color= property(_get_color, _set_color) test = Test() test.color = (255, 255, 0) print test.color print test._rgh
$ python test.py (255.0, 255.0, 0.0) (1.0, 1.0, 0.0)
全プロパティの名前や値を取得する方法は、以下を参照
サンプル
class Test: def __init__(self, options): self.options = options print('argv:options: ', options) def debug(self): self.options['debug'] = 'add debug' print('debug: self.options: ', self.options) options = { 'r': 'recursive' } a = Test(options) a.debug()
実行結果は以下のようになります。
('argv:options: ', {'r': 'recursive'}) ('debug: self.options: ', {'debug': 'add debug', 'r': 'recursive'})