情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

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にはbarpiyoを追加したのでアクセス出来ますが、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"

この場合、foohogeはクラスメンバです。

インスタンスxを作ってfoohogeにアクセスしてみると、このクラスメンバが呼ばれているのが分かります。

>>> x.foo
42
>>> x.hoge()
hoge

インスタンスyを作ってクラスメンバと同じ名前のfoohogeを追加してアクセスしてみます。

>>> 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

(続く...)

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-python