環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Python の __slots__ を使うとインスタンス変数を勝手に作れなくなる

Python のクラスを勉強すると、インスタンスにクラスで定義していない変数を勝手に追加できることに衝撃を受けます。

class Person:
    def __init__(self, name, age):
        self.id = 0
        self.name = name
        self.age = age


a = Person(name='Leonardo', age=48)
a.movie = 'Titanic'

print(a.__dict__)

# {'id': 0, 'name': 'Leonardo', 'age': 48, 'movie': 'Titanic'}

movie という変数は Person にありません。この柔軟さは Python の強みですが、クラスの変数やメソッドを厳格に管理する場面で弱みになります。

slots

__slots__ は属性 attribute の定義に使います。インスタンス変数も属性の一つです。

class User:
    __slots__ = 'id', 'name', 'age'

    def __init__(self, name, age):
        self.id = 0
        self.name = name
        self.age = age


b = User(name='DiCaprio', age=48)
b.movie = 'Titanic'

# AttributeError: 'User' object has no attribute 'movie'

インスタンスは __slots__ で定義された属性のみをもちます。movie__slots__ にないため、bmovie にアクセスできません。

slots にないインスタンス変数をそもそもクラス内で定義できない

Python クラス