クラス/アトリビュート/スロット/カプセル化/プロパティ/継承 [Python]
目次
1. クラスとアトリビュート
2. スロット
3. コンストラクタとメソッド
4. カプセル化(アクセス制限)
5. プロパティ
6. 継承
7. 演算子のオーバーロード
※サンプルコードの「---」以下は出力結果です。
1. クラスとアトリビュート
# クラス定義 class MyClass: pass # クラスの生成 obj= MyClass() # アトリビュートの追加 obj.value = 12345 # アトリビュートからデータを取得する obj.value --- 12345
クラスにメソッドや処理がない場合には「pass」を定義します。アトリビュートはPython版のクラスメンバのようなものです。自由に追加できて読み書き可能です。
2. スロット
スロット機能を使用すると追加できるアトリビュートを制限できます。
class MyClass: # aとbのアトリビュートのみを許可する __slots__ = ['a','b'] obj= MyClass() obj.a = 1 obj.b = 2 obj.c = 3 # ここでエラーになる --- AttributeError
3. コンストラクタとメソッド
class MyClass: # コンストラクタ(メソッド) def __init__(self, a, b, c): self.a = a self.b = b self.c = c # メソッド def calc(self): return self.a + self.b + self.c obj= MyClass(10,20,30) obj.calc() --- 60
コンストラクタ、メソッド
第一引数は必ず「self」にする必要があります。この「self」は自動的にインストタンスが代入されます。selfはクラスのメソッドやアトリビュートにアクセス可能です。
4. カプセル化(アクセス制限)
Pythonでカプセル化するにはアトリビュート/メソッド名の先頭に「_」または「__」を付加するだけです。アンダーバー1個はクラス内部用であると宣言。アンダーバー2個はより厳しく制限するという違いがあります。
5. プロパティ
class MyClass: def __init__(self): # アトリビュート self._x = 0 # ゲッターの定義 def getX(self): return self._x # セッターの定義 def setX(self, value): self._x = value # プロパティの定義 x = property(getX, setX) obj= MyClass() obj.x = 10 obj.x --- 10
6. 継承
class Parent: def __init__(self, a, b, c): self.a = a self.b = b self.c = c self.d = 777 def output(self): return self.d # 継承 class Child(Parent): def __init__(self, a, b, c): # 親クラスのコンストラクタを呼び出す super().__init__(a,b,c) print("Childのコンストラクタ") def xxx(self): print (888) obj= Child(1,2,3) obj.output() --- Childのコンストラクタ 777
今回は1つの継承ですが、Pythonでは多重継承が可能です。また、継承によるメソッドのオーバーライドは完全に上書きされます。必要であればsuper()で親クラスのメソッドを実行する必要があります。
上記の例では16行目で親クラスのコンストラクタを呼び出さないと、24行目でエラー(dのアトリビュートが存在しない)となります。
7. 演算子のオーバーロード
class MyClass: def __init__(self, value): self.value = value # 特殊メソッド def __add__(self, obj): return self.value + int(obj) obj= MyClass(10) obj + 1 --- 11