Python2覚書 クラスの定義
下のひな形から、クラス定義に関する文法をチェックしてみます。
クラス名 | |||
---|---|---|---|
可視性 | 属性名 | 型 | |
可視性 | メソッド名 | (引数名:引数型) | 返却値型 |
|
| ||||||||||||||||||||||||||||||||||||
class Person: #nick_name="" def __init__(self, name): self.nick_name = name def greet(self): print "I'm " + self.nick_name he = Person("tenor_p") she = Person("soprano_p") he.nick_name="tenor_p" she.nick_name="soprano_p" he.greet() she.greet() |
class Person: #__name = "" def __init__(self, name): self.__name = name def smile(self, num): print self.__name self.__face(num) def __face(self , num): print ":) " * num she = Person("Alice") he = Person("Bob") he.smile(5) she.smile(5) | ||||||||||||||||||||||||||||||||||||
I'm tenor_p I'm soprano_p | Bob :) :) :) :) :) Alice :) :) :) :) :) |
クラスの定義
外部からアクセスできるメンバはクラス内でそのまま定義します。メソッドの引数には自分自身の参照を表す"self"を記述します。
def smile(self, num):
クラス内でメンバにアクセスする場合は"self."を付けます。
self.nick_name = name
self.smile(3)
データの隠蔽
外部から隠蔽したいメンバは"__"を変数・関数名に付けて定義します。
class Person: __name = "" def __face(self , num):
初期化メソッド
インスタンスが生成された時に呼び出される初期化メソッド(コンストラクタ)は、"__init__"で定義することができます。
def __init__(self, name): self.nick_name = name
インスタンスの生成
he = Person("Alice") she = Person("Bob")
インスタンスの利用
"."を使って外部からインスタンスのメンバにアクセスすることができます。呼び出し側の引数ではselfを省きます。
he.nick_name="tenor_san" she.nick_name="soprano_san" he.smile(5) she.smile(5)
メンバ変数の追加
Pythonでは、メンバ変数やメンバ関数をインスタンス化した後にも追加することができます。例えば上の例で、インスタンスheを生成したあと、
he.new_att = 3
とすると、heインスタンスに新たな属性new_attを追加することができます。
print he.new_att #OK
しかし、インスタンスheにメンバを追加してもsheには追加されていません。
print she.new_att #compile error
Personクラスそのものに後からメンバを追加すると、生成したインスタンスにもその時点でメンバが追加されます。
Person.new_att = 3
print he.new_att #OK print she.new_att #OK
メンバ関数の追加
メンバ関数もクラス宣言の外から追加できます。
def new_method(self): print "new method" Person.new_method = new_method
メンバ関数を追加する前に生成したインスタンスにも一様に追加されるようです。
she=Person("Alice") he=Person("Bob") def new_method(self): print "new method" Person.new_method = new_method she.new_method() he.new_method()
new method
new method