クラスの超基礎2.特別なメソッド

昨日のエントリでも既に使っていますが"__init__""のような"__"で挟まれた名前のメソッドは特別な意味を持っています。

"__init__"はインスタンスが作成される時に自動的に実行され、インスタンスを初期化するメソッドです。

class Test:
  
  def __init__(self,x,y):
    self.x = x
    self.y = y
    print self.x , self.y , "を初期化したよ"

a = Test(3,5)

例えばこのコードを実行するとaというインスタンスを作成した時点で

3 5 を初期化したよ

と表示されます。

逆にインスタンスが破棄される場合に実行される"__del__"というメソッドもありますが、インスタンスを破棄するタイミングがガベージコレクタにまかされているという都合上、使用に当たっては注意点が多く最低限実行しなければならないことのみを記述するのが望ましいようです。例は分かりませんでした(^_^;)

他には"__str__"というメソッドもあります。これはそのクラスのインスタンスに対してstr()関数が実行された場合に呼び出され、返す文字列を決めます。

class Test:
  
  def __init__(self,x,y):
    self.x = x
    self.y = y
    
  def __str__(self):
    return "xは" + str(self.x) + ",yは" + str(self.y) + "です"

a = Test(3,5)

print str(a) #xは3,yは5です

"__len__"はlen()に対する返答を"__nonzero__"はbool()に対する返答を決めます。

class Test:
  
  def __init__(self,x,y):
    self.x = x
    self.y = y
    
  def __len__(self):
    return self.x + self.y
  
  def __nonzero__(self):
    return 0

a = Test(3,5)

print len(a) #8

print bool(a) #False

なお"__nonzero__"が記述されていない場合は"__len__"の方が評価され0であればFalse、それ以外であればTrueとなります。

他にもこのような特殊メソッドはいろいろあるのですが中でも重要になりそうなものに"__iter__"メソッドがあります。
これはクラスのインスタンスに対してfor in文が実行された場合の振る舞いを定義します。
これはfor in文の仕組みそのものとも関わってくるので明日のエントリで整理したいと思います。