【Python入門】クラスの基本 インスタンス- Python初心者勉強記024
今回からPythonのクラスを見ていきます。
クラスは変数や関数が集まったコードのブロックで、それぞれにローカルな名前空間が割り当てられます。この機能を使うことでオブジェクト指向プログラミングが可能になります。
クラスは一種の設計図です。このクラスという設計図をもとにインスタンス(実体)を作り出します。
例えばRPGゲームを作る時は、「モンスター」というクラスから「ゴブリン」や「スライム」などのインスタンスを作り出すといった具合です。
ここから、クラス作成のPythonの文法を見ていきましょう。
インスタンスに関する文法
インスタンスの生成
まず、クラスを定義するには
class クラス(継承元のクラス名):
とします。継承元のクラス名は「object」としておきましょう。(これについては、次回以降解説します)
インスタンス生成を行うには、
インスタンス = クラス名()
とします。
インスタンスの属性
一般的にオブジェクトは属性を持ち、参照や変更・追加を行うことができます。
個々のインスタンスで保持する属性をインスタンス属性と呼びます。
次のコードでは、複数のインスタンスにそれぞれsuffixという属性を設定しています。
Pythonには、オブジェクト内部からのみアクセスできる(プライベートな)属性は厳密には存在しません。「obj._x」のように最初にアンダースコアがついた属性を慣例的にプライベートな属性として扱います。
インスタンスのメソッド
クラス内で定義される関数はメソッドと呼ばれます。
中でも、インスタンス・メソッドはメソッド内でインスタンス自身を参照できるものです。
書き方を見ていきましょう。
インスタンス・メソッド内の「self」はインスタンス自身を表します。
メソッドの第1引数である「self」の中身は自動的に渡され、第2引数以降はメソッド呼び出し時に渡した引数に対応します。
特殊メソッド
メソッドの中でも、プログラムの特定の内部イベントで動作するメソッドがあり、特殊メソッド呼ばれます。特殊メソッドの名前には「_xxx_」とアンダースコアが両端に付いたものになります。
代表的なものはインスタンスを生成する時に呼び出されるコンストラクタです。Pythonでは「_init_」というインスタンスメソッドで書きます。
この例では、インスタンス作成時に、num属性が初期化されます。
プロパティ
プロパティを使うことで、「get_xxx」や「set_xxx」のインスタンスメソッドを使って、「xxx」というインスタンス属性を扱っているように見せることができます。
「privateがないPythonでgetterやsetterを使う必要があるのか?」という疑問が湧く方もいらっしゃるかもしれませんが、
これを使うことで状態の取得、更新、削除の前後に何らかの処理をはさめむことができます。
例えば、パーセンテージを表すときに、プログラム内部では「0.1」で扱い、外部的には「10」で扱うといった処理を書くことができ、
更にこれらを簡単に使用することができます。
プロパティの設定には、property関数を使う方法とデコレーターを使う方法があります。
・property関数を使う方法
>>> class Myclass(object):
... def __init__(self,ratio):
... self._ratio=ratio/100.0
... def _get_ratio(self):
... return self._ratio*100
... def _set_ratio(self,ratio):
... self._ratio = ratio/100.0
... ratio = property(_get_ratio,_set_ratio)
...
>>> ins = Myclass(10)
>>> ins.ratio
10.0
>>> ins.ratio=5
>>> ins._ratio #プログラム内部では[0.05]として扱っている
0.05
・デコレーターを使う方法
>>> class Myclass(object):
... def __init__(self,ratio):
... self._ratio=ratio/100.0
... @property #getterの設定
... def ratio(self):
... return self._ratio*100.0
... @ratio.setter #setterの設定
... def ratio(self,ratio):
... self._ratio=ratio/100.0
...
>>> ins = Myclass(10)
>>> ins.ratio
10.0
>>> ins.ratio=5
>>> ins.ratio
5.0
>>> ins._ratio
0.05
Python入門講座の次の記事はこちら => 【Python入門】クラスの文法 継承について- Python初心者勉強記025