プログラミングなど

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
で確認することが可能です。

2009年6月12日金曜日

pythonでプロパティ

pythonでプロパティを使用する例。

---- コード ----

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

class Coordinate:
  _coord = [0.0, 0.0, 0.0] # x, y, z

  def __init__(self, x = 0.0, y = 0.0, z = 0.0):
    self._coord[0], self._coord[1], self._coord[2] = x, y, z

  def getx(self):
    return self._coord[0]
  def setx(self, value):
    self._coord[0] = value
  x = property(getx, setx)
  def gety(self):
    return self._coord[1]
  def sety(self, value):
    self._coord[1] = value
  y = property(gety, sety)
  def getz(self):
    return self._coord[2]
  def setz(self, value):
    self._coord[2] = value
  z = property(getz, setz)

coord = Coordinate(11.2, 12.3)
coord.x = 15.0
coord.y = 12.8

if __name__ == "__main__":
  print coord.x, coord.y, coord.z

# end of file