wvogel日記

自分用の技術備忘録が多めです.

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属性になったりするんだろうか。


個人的には、型宣言がないのが若干怖いですね。
今まで動的型付け言語やってこなかったし。
型によるエラーを発見できないような。