[Python面向对象编程] __slots__属性

Posted by Chase Shen on 2022-01-03
Estimated Reading Time 1 Minutes
Words 439 In Total
Viewed Times

__slots__ 是 Python 中用于限制类的实例可以拥有的属性的机制。通过定义__slots__属性,你可以告诉 Python,该类的实例只能拥有指定的属性,而不能动态地添加新的属性。

通常情况下,Python 中的对象可以动态地添加新的属性。但是,有时候我们希望限制对象的属性,只允许拥有预先定义好的属性。这种情况下,可以使用__slots__属性。

1
2
3
4
5
6
7
8
9
class Person:
__slots__ = ['name', 'age'] # 只允许实例拥有 'name' 和 'age' 两个属性

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

person1 = Person('Alice', 30)
person1.address = '123 Street' # 此处会报错,因为 'address' 不在 __slots__ 中

在这个示例中,__slots__ = ['name', 'age']告诉 Python,Person 类的实例只能拥有 'name''age' 两个属性,而不能拥有其他属性。因此,尝试给 person1 实例添加新的属性时,比如 'address',会导致 AttributeError 错误。这样可以防止意外地向对象添加新的属性,从而加强了代码的健壮性和可维护性。

需要注意的是,使用 __slots__ 会有一些限制和注意事项:

  • 定义了 __slots__ 的类会更加紧凑,节省了内存空间,但是失去了动态添加属性的灵活性。
  • __slots__ 中的属性名必须是字符串形式,不能使用其他的属性名格式。
  • 子类不会继承父类的 __slots__ 属性,除非子类也定义了自己的 __slots__ 属性。
  • __dict__ 属性会被覆盖,因此实例不能通过 __dict__ 属性动态地添加新的属性。
  • __weakref__ 属性不受 __slots__ 的影响,即便定义了 __slots__,实例仍然可以创建弱引用。

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !