Python class test
Pythonで今日はクラスの勉強。
とりあえず、リストまわりの関数群を集めたクラスを作ろうかと思って、リストクラスを作ることに。
単純に、リストを表示させる。
class list: def __init__(self,l): self.l = l def show(self): print self.l if __name__ == "__main__": list = list([1,2,3,4,5]) list.show()
初め、このインスタンスメソッドのshow関数、
これを
def show():
のように宣言していたけど、
$ python class.py Traceback (most recent call last): File "class.py", line 11, in <module> print list.show() TypeError: show() takes no arguments (1 given)
のように、引数が少ないとか文句言われて困った。
調べてみると、
コンストラクタ
(C++での呼び名ですね、Pythonではなんと呼ぶんだろ...)
同様、自分自身を引数としてとる必要があるようです。
あれ、じゃあインスタンスとかの宣言は、すべて引数及び
__init__関数内で行ってしまうのか?
でもそれだと値の書き換えはどうなるんだろう。
こういうときはインタプリタで実験
>>> class test: ... def __init__(self,a): ... self.a = a ... def add(self): ... self.a += 1 ... >>> hoge = test(10) >>> hoge.a 10 >>> hoge.add() >>> hoge.a 11 >>> hoge.a += 1 >>> hoge.a 12
ダメじゃん!アクセス出来てしまう!
publicなメンバとしてアクセス可能なようです。
調べてみたら、アンダーバーを二つつけるとprivate属性に出きるよう。
class test2: def __init__(self,a): self.a = a self.__a = a def add(self): self.__a += 1 def value(self): return self.__a
これに対し、
hoge = test2(256) print hoge.a hoge.add() print hoge.value()
までは当然実行できます。
次いで、
print hoge.__a
とすると、
AttributeError: test2 instance has no attribute '__a'
と、上記エラーが吐かれる。
確かに隠蔽できています。
なるほどー。
てことは、アンダーバー1つでは、protected属性になったりするんだろうか。
個人的には、型宣言がないのが若干怖いですね。
今まで動的型付け言語やってこなかったし。
型によるエラーを発見できないような。