ホーム > カテゴリ > Python・人工知能・Django >

クラス/アトリビュート/スロット/カプセル化/プロパティ/継承 [Python]

Python/TensorFlowの使い方(目次)

目次

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





関連記事



公開日:2018年07月02日 最終更新日:2021年02月25日
記事NO:02688