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月16日火曜日
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
---- コード ----
# -*- 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
登録:
投稿 (Atom)