python class Parent:__slots__ = ['name', 'age']class Child(Parent):__slots__ = ['gender']p = Parent()p.address = '123 Main St' # 这是允许的,因为Parent类未显式限制__slots__c = Child()c.address = '456 Park Ave' # 这也是允许的,因为Child类未显式限制__slots...
超详细 Python “__slots__ ” 属性详解
Python是动态语言,允许类实例拥有任何属性,这些属性通常存储在__dict__中。不过,使用字典进行存储虽然灵活,但占用较多内存空间,效率较低。为了解决这一问题,引入了__slots__属性。
__slots__属性的主要作用是声明和限定类成员,同时拒绝类实例创建__dict__和__weakref__属性,从而节省内存空间。通过使用__slots__,开发人员可以预先指定类实例能够拥有的属性,有效控制内存使用。
在使用__slots__时,需要注意其在继承树中的行为。当子类未明确声明__slots__时,不会继承父类的__slots__,这意味着子类实例可以自由添加任意属性。反之,如果子类声明了__slots__,则会继承父类的__slots__,同时保留自身的属性限制。
以下面的示例来说明这一概念:
python
class Parent:
__slots__ = ['name', 'age']
class Child(Parent):
__slots__ = ['gender']
p = Parent()
p.address = '123 Main St' # 这是允许的,因为Parent类未显式限制__slots__
c = Child()
c.address = '456 Park Ave' # 这也是允许的,因为Child类未显式限制__slots__
在这个例子中,虽然`Child`类实例尝试添加了`address`属性,但由于其未被限制在`__slots__`中,因此成功添加。通过明确指定`__slots__`,可以避免此类问题,确保类实例只包含预期的属性。2024-09-19