クラス  †
- 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