クラス †
- class.py
#!/usr/bin/env python
# coding: utf-8
import math
"""
クラスの練習
"""
__author__ = "kagyuu <kagyuu@hondou.homedns.org>"
__version__ = "0.00"
__date__ = "15 Oct 2012"
#######################################################################
class MyClass(object) :
"""
練習用のクラス.
Objectクラスを継承する練習用のクラス
"""
def __init__(self, x, y) :
"""
コンストラクタ
@param self インスタンス
@param x x座標
@param y y座標
"""
# インスタンス変数はコンストラクタで self に対する属性
# 追加で定義
self.x = x
self.y = y
def rotate(self, theta) :
"""
引数 theta ラジアン分原点中心で回転します
@param self インスタンス
@param theta 回転する角度(ラジアン)
"""
tx = self.x
ty = self.y
self.x = tx * math.cos(theta) - ty * math.sin(theta)
self.y = tx * math.sin(theta) + ty * math.cos(theta)
@staticmethod
def deg2rad(deg) :
"""
度数をラジアンに変換します
@param deg 度数
@return ラジアン
"""
return math.radians(deg)
def __get_dimension(self) :
"""
座標を返します.
@param self インスタンス
@return tuple(x,y)
"""
return self.x, self.y
def __set_dimension(self, xy) :
"""
座標を設定します
@param self インスタンス
@param xy
"""
self.x = xy[0]
self.y = xy[1]
# プロパティ定義
# p = MyClass.dimenstion で、__get_dimension が呼ばれます
# MyClass.dimenstion = p で、__set_dimension が呼ばれます
dimension = property(__get_dimension, __set_dimension)
#######################################################################
def main() :
"""
本モジュールをコマンドラインから実行するための関数.
"""
xy = MyClass(100, 100)
print(xy.dimension)
for i in range(1,9):
xy.rotate( MyClass.deg2rad(45.0) )
print(str(i * 45) + '度回転:' + str(xy.dimension))
xy.dimension = (20, 50)
print(xy.dimension)
if __name__ == '__main__':
main()
- 実行結果
$ ./class.py
(100, 100)
45度回転:(1.4210854715202004e-14, 141.4213562373095)
90度回転:(-99.99999999999999, 100.00000000000003)
135度回転:(-141.4213562373095, 4.263256414560601e-14)
180度回転:(-100.00000000000004, -99.99999999999997)
225度回転:(-5.684341886080802e-14, -141.4213562373095)
270度回転:(99.99999999999996, -100.00000000000006)
315度回転:(141.4213562373095, -8.526512829121202e-14)
360度回転:(100.00000000000007, 99.99999999999994)
(20, 50)
- ポイント
- コンストラクタ def __init__(self, x, y) :
- メンバ変数は コンストラクタで定義する (フィールドに定義するとクラス変数になる)
- メンバ関数 def rotate(self, theta) :
- プロパティ dimension = property(__get_dimension, __set_dimension)
- クラスに所属する関数の第一引数は self (インスタンス)
- @staticmethod は、外部からも呼べる普通の関数
クラス変数 †
>>> class YourClass(object) :
counter = 1
def __init__(self, msg) :
self.msg = msg
@classmethod
def createYourClass(cls) :
msg = "ID:" + str(cls.counter)
cls.counter += 1
return cls(msg)
>>> c1 = YourClass.createYourClass()
>>> c1.counter
2
>>> c1.msg
'ID:1'
>>> c2 = YourClass.createYourClass()
>>> c2.counter
3
>>> c2.msg
'ID:2'
>>> c1.counter
3
>>> c1.msg
'ID:1'
- フィールドに定義した変数は (counter) は、全インスタンス共通のクラス変数
- クラス変数は @classmethod がついたメンバ関数から操作できる。@classmethod の第一引数は Class
継承 †
- 多重継承可能 MyClass?(cls1,cls2,cls3)
- 継承元のメソッド xxx() の呼び出し super().xxx()
- 何を継承しているかの判定 isinstance(instance, class)
Python