Pythonのクラス(1)
Pythonでクラスを定義する場合は、次のような形になります。
class MyClass(MyBaseClass1, MyBaseClass2, ...):
def MyMethod(self, argument1, augument2, ...):
#メソッドの中
def get_spam(self):
return self.spam
def set_spam(self, _spam):
self.spam = _spam
class
キーワードの後にクラス名を書き、その後の括弧の中にベースクラスのリストを入れます(省略可能)。PythonはJavaやC#と違って、多重継承が可能です。インターフェースという概念は無いようです。
メソッドは関数と同じ書き方になります。
第1パラメータは決まっていて、メソッドを呼び出したインスタンスオブジェクトが入ります。この変数を使って他のメンバにアクセスします。
インスタンスフィールドは、宣言なしで使えます。self.spam = 42
のように代入した瞬間にそのインスタンスにフィールドが追加されます。
一般的にはセッターやゲッターを用意してやってアクセスするようです。
任意のフィールドをインスタンスに追加するだけでなく、メソッドを追加することも出来たりします。
>>> class MyClass:
... foo = 42
... def hoge(self):
... print "hoge"
...
>>> x = MyClass()
>>> y = MyClass()
>>> x.bar = x.foo
>>> x.piyo = x.hoge
>>> x.foo
42
>>> x.bar
42
>>> x.hoge()
hoge
>>> x.piyo()
hoge
>>> y.foo
42
>>> y.bar
Traceback (most recent call last):
File , line 0, in <stdin>##45
AttributeError: 'instance' object has no attribute 'bar'
>>> x.hoge()
hoge
>>> y.piyo()
Traceback (most recent call last):
File , line 0, in <stdin>##47
AttributeError: 'instance' object has no attribute 'piyo'
x
にはbar
やpiyo
を追加したのでアクセス出来ますが、yには追加していないのでアクセスしようとするとエラーになります。
初期化処理を行いたい時は、コンストラクタを使います。
class MyClass:
def __init__(self):
self.spam = "spam"
self.ham = "ham"
self.eggs = "eggs"
...
__init__
という名前のメソッドがコンストラクタになります。
デフォルトでクラスのメンバは全てパブリックです。
隠蔽したい場合は、メンバ名の先頭に1つか2つの_
(アンダーバー)を付けてやります。
但し、1つだけ付けた場合は、クラスの利用者に対する、「これはプライベートメンバなので外部から参照しないようにして下さい」というサインでしかありません。プログラム上、依然として外部からアクセスすることは可能です。
もっと厳格に、プライベートメンバとして外部からのアクセスを禁止する為には、_
(アンダーバー)を2つ付ける必要があります。
>>> class MyClass:
... spam = 23
... _ham = 42
... __eggs = spam * _ham
...
>>> x = MyClass()
>>> x.spam
23
>>> x._ham
42
>>> x.__eggs
Traceback (most recent call last):
File , line 0, in <stdin>##27
AttributeError: 'instance' object has no attribute '__eggs'
Pythonのクラスで1つ注意しておかなければならないのは、インスタンスメンバでクラスメンバを隠してしまうことが出来る点です。
下のようなクラスがあったとします。
>>> class MyClass:
... foo = 42
... def hoge(self):
... print "hoge"
この場合、foo
やhoge
はクラスメンバです。
インスタンスxを作ってfoo
とhoge
にアクセスしてみると、このクラスメンバが呼ばれているのが分かります。
>>> x.foo
42
>>> x.hoge()
hoge
インスタンスy
を作ってクラスメンバと同じ名前のfoo
とhoge
を追加してアクセスしてみます。
>>> def fuga():
... print "fuga"
...
>>> y = MyClass()
>>> y.foo = 23
>>> y.hoge = fuga
>>> y.foo
23
>>> y.hoge()
fuga
y
のインスタンスメンバでMyClass
のクラスメンバが隠されているのが分かります。
ここで、もう一度x
のメンバを呼んでみると、依然としてクラスメンバにアクセスしているのが分かります。
>>> x.foo
42
>>> x.hoge()
hoge
(続く...)
