プログラミングなど

2009年6月16日火曜日

Python setattr()でクラス内の関数を設定する

setattr()を使用することで、属性の設定ができるので、それを利用して、クラス内の関数の変更方法などを調べてみました。

---- コード ----

# -*- coding: utf-8 -*-

class Calc:
  data = 10
  def run(self, a, b):
    return a + b

def minus(a, b):
  return a - b

def plus(self, a, b):
  return a + b + self.data

def main():
  calc = Calc()
  print calc.run(1, 2)    # 3 を出力

  calc_minus = Calc()
  setattr(calc_minus, "run", minus)

  print calc.run(1, 2)    # 3 を出力
  print calc_minus.run(1, 2) # -1 を出力

  setattr(Calc, "run", plus)
  calc_plus = Calc()
  print calc.run(1, 2)    # 13 を出力
  print calc_minus.run(1, 2) # -1 を出力
  print calc_plus.run(1, 2)  # 13 を出力

if __name__ == "__main__":
  main()

================================

コードの例の calc_minus のように setattr(インスタンス, "属性名", 関数) とすることによって、関数をインスタンスに設定することは可能だが、その関数では、メンバ(属性)を利用することができない。
calc_plus のように、setattr(クラスオブジェクト, "属性名", 関数) とすることによって、メンバ(属性)を関数で使用することができる。

なお、関数のアドレスは、
 print calc.run
 print Calc.run
で確認することが可能です。

0 件のコメント:

コメントを投稿