クラスの超基礎

私はこれまでJavascriptしか勉強したことがないのでクラスの勉強をするに当たって、「クラスとは?」というところから始めなければなりません。
といっても、Javascriptの勉強の際にも「クラスベースの言語では〜」と言った記述をあちらこちらで目にしてきたので全く何の知識もないわけではない(と思ってる)のでコードを書きながら勉強していくことにします。

とりあえず書いてみる。

class Test:
  
  def __init__(self,x,y):
    self.x = x
    self.y = y
    
  def plus(self):
    return self.x + self.y
  
  def minus(self):
    return self.x - self.y
  
a = Test(10,5)

print a.plus() #15

print a.minus() #5

一番のポイントはself(らしい)です。Javascriptで言えばthisにあたるものですがPythonでは自動的には設定されずメソッドの第一引数として定義します。selfは予約語ではなく別に他の単語でもいいのですがselfを使うのが慣例のようなのでそれに従っています。Eclipse + PyDevを使っているとイタリックで表示されるのでかなりメジャーな慣例です。

もう一つのポイントはクラス定義内で登場する変数はすべてそのクラスの属性になるということですね。

class Test:
  
  def __init__(self,x,y):
    self.x = x
    self.y = y
    
  z = 3
    
  def plus(self):
    return self.x + self.y
  
  def minus(self):
    return self.x - self.y
  
  def plusEnh(self):
    return self.x + self.y + self.z

a = Test(10,5)

print a.plus() #15

print a.minus() #5

print a.plusEnh() #18

print a.z #3

この例のzはクラス内のローカルな名前空間で定義されていますがa.zとして外部から参照や書き換えが可能ということです。外部から参照不可能な変数は作れないということですね。ただし慣習として外部からアクセスされたくない変数はアンダーバー( _ )を付けるようです。

class Test2:
  
  def __init__(self,x,y):
    self.x = x
    self.y = y
    
  _z = 3 #アクセスしないでね
  
  def plusEnh(self):
    return self.x + self.y + self._z
 
a = Test2(10,5)

print a.plusEnh() #18

a._z = 5   #ただしあくまで慣習であってできないシステムではない

print a.plusEnh() #20

しばらくはクラスの基本を勉強していきたいと思います。