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 件のコメント:
コメントを投稿