Pythonのクラスや構造体

最終更新日02 Mar 2018 02:49

クラスの定義

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

Cと違うところ
  • メンバ関数の第一引数にはすべてselfがつく

namedtuple

from collections import namedtuple
Point = namedtuple("Point",["x","y"])
p=Point(11,22)
print(p)
p=Point(x=10,y=32)#attribute指定して値をセットすることもできる 可読性アップ!
print(p)
Point(x=11,y=22)
Point(x=10,y=32)

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

>>> 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

pythonならではの便利な機能

メンバにセットされてる値を辞書形式で表示

class A():
    def __init__(self):
        self.a="a"
        self.b=1
    def func(self):
        print(self.a)
a=A()
print(vars(a))

結果

{'b': 1, 'a': 'a'}

print(dir(クラス名))

てやるとメンバと関数一覧を表示してくれる
[[/code]]
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()

クラスメンバを表示する

class Point():
    def __init__(self,_x,_y):
        self.x=_x;
        self.y=_y;
p = Point(1,2)
print(dir(p))#関数と変数(あらかじめ入ってるものも含むので大量に出てくる)
print(vars(p))#自分でセットした変数とその値

出力結果
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x', 'y']
{'x': 1, 'y': 2}

weakrefまではあらかじめはいってるやつっぽい

感想

Pythonでクラスを書くのは結構まどろっこしい。。
tupleはどこに何を置いたかわからなくなるからイヤだから名前をつけたい程度の動機だった場合、
クラスより手軽なC++でいう構造体的な用途で使うにはnamedtupleがいいかも。
namedtupleの方がdictよりもメンバにシンタックスハイライトが効きそうに思えるが、
Visual Studioでさえシンタックスハイライトしてくれなかったので現状私にとってnamedtupleを使うメリットがあまりない。
関数の戻り値として手軽なクラスを使うなら、namedtupleよりもdictの方が1行で書けて快適だと思う
namedtupleを戻り値にするとこうなる

def func():
    Result = namedtuple("Result",["a","b"])
    return Result(a=1,b=2)

dictで書くとこうなる
def func():
    return {"a":1,"b":2}

dictの方がより簡潔

python-function python-module


ファイル

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