Pythonのクラスや構造体

python-class.png

がんばってさがしたけどいいのがない。
本当にpythonの何が素晴らしいのかさっぱりわからない。
pythonでクラスや構造体をするには?

from collections import namedtuple
Foo = namedtuple("Foo", "foo bar")
f = Foo(1, 2)
print f.foo # 1
print f.bar # 2

構造体を作ってそこにバイナリファイルを読み込む

>>> record = 'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
 
>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', s))
Student(name='raymond   ', serialnum=4658, school=264, gradelevel=8)

注意

タプルの名前に日本語はダメ。
メンバ名にも日本語ダメ。

nametupleは好き勝手に値を変えられない???

AttributeError: can't set attribute

クラスを作る

結局クラスを作ったほうがよさそう

class Point():
    def __init__(self,_x,_y):
        self.x=_x;
        self.y=_y;

Cと違うところ

  • メンバ関数の第一引数にはすべてselfがつく

pythonならではの便利な機能

strってのをオーバーライドするとデバッグに便利

def __str__(self):
        return str(self.latitude)+","+str(self.longitude);
print(オブジェクト名);
print("これの値はこうですよ→"+str(オブジェクト名));

というかんじで使える。

オーバーライド可能な関数

  • __new__…コンストラクタ?
  • __init__…コンストラクタ
  • __del__….デストラクタ
  • __repr__…文字列への変換 組み込み関数repr() デバッグに用いられる
  • __str__…printにしたり、文字列として出したい情報を書く 戻り値は文字列じゃないとダメ
  • __lt__…x<y
  • __le__…..x<=y
  • __eq__….operator==
  • __ne__….x!=y
  • __gt__….x>Y
  • __ge__….x>=y
  • __cmp__….比較
  • __rcmp__…もはやサポートされていない
  • __hash__…辞書演算の際に使う
  • __nonsero__…0か1を返す
  • __unicode__

クラスを使う時

x = MyClass()

python-module

サポートサイト Wikidot.com python-module