1. 基本
  2. 特殊メソッド
  3. サンプル

    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_total
      self.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'})