Python の __slots__ を使うとインスタンス変数を勝手に作れなくなる
2023.02.18
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__
にないため、b
は movie
にアクセスできません。