自分の中で未だに謎のクラスについて、なんとなくヒントになりそうなことを書き連ねていきます。
クラスは振る舞い(関数)と状態(変数)をパッケージ化したもの。
「クラス関数」や「クラス変数」と呼んでいたのが、いつの間にか「クラス」と「属性」と呼ばれるようになった。
インスタンス化とは、「クラスを呼び出してオブジェクトを生成する。」こと。
例えば下のようなクラスと書いてみる。
>>> class AnoTanuki:
>>> pass
そして実行すると….
…
…
何も起こらない!
んで、このクラスからオブジェクトを生成してみる。
>>> a=AnoTanuki()
>>> b=AnoTanuki()
ここでこのオブジェクトaとbは振る舞い(クラスで定義したメソッド)を共有しますが、状態(属性)は共有せずに、それぞれのコピーを持ちます。
コントラクタはオブジェクトを最初に生成したときの動作を定義できる特殊なメソッド。
Pythonで言うなら__init__とか__repr__とか
__init__はメソッドで、関数と同様なので、どんな数の引数値でも渡せます。
__repr__ メソッド「Return the canonical string representation of the object」(オブジェクトの印字可能な表現を含む文字列を返す)、つまりオブジェクトの文字列バージョンを返す必要がある。
とりあえず、なんか簡単なクラスを書いて実行したら、なんとなくわかるかも。
(初期値を入力する、もしくはa=0, b=1で、add()の関数を呼び出すたびに数字が足されるクラス)
>>> class AddNumber:
>>> def __init__(self, a=0, b=1):
>>> self.a=a
>>> self.b=b
>>> def add(self):
>>> self.a += self.b
>>> def __repr__(self):
>>> return str(self.a)
んで、実行してみる。
>>> a=AddNumber()
>>> b=AddNumber(100)
>>> c=AddNumber(100, 10)
>>> a
0
>>> a.add()
>>> a
1
>>> b
100
>>> b.add()
101
>>> c
100
>>> c.add()
110
こんな感じの動きをする。入力値をselfとして表現して、初期値設定した上で関数とreturnで構成するのがクラスらしい。
うわ〜。なんの説明にもなっていない文章となりました。すみません。最後に役立ちそうな情報だけ載せておきます。
クラスと関数の名前について
Pythonのクラスの名前にはキャメルケース(AnoTanukiとかAreTotteとか、大文字から開始される単語の連結)を使うと言う規約が定着しています。一方、関数の名前には、onigiriとかgoma_dangoとか小文字と_を使用することが定着しています。自分のコードが他の人にも読まれることもあると思うので、このルールに沿ってカキカキしましょう。

