python __slots__

一、 __slots__作用

首先看一段代码

class People(object):
    def __init__(self):
        pass
  

if __name__ == '__main__':
    a = People()
    a.score = 90  # 动态设置对象属性
    print(a.score)

python中可以为对象动态设置属性,但是如果想限定可以动态设置的属性,可以使用__slots__,比如限制People的实例对象只可以设置name、age属性。

class People(object):
    __slots__ = ('name', 'age')

    def __init__(self):
        pass


if __name__ == '__main__':
    a = People()
    a.score = 90  # 动态设置对象属性
    print(a.score)

再次运行代码,报错

Traceback (most recent call last):
  File "/Users/.../Desktop/flaskr/slots_desc.py", line 14, in <module>
    a.score = 90  # 动态设置对象属性
AttributeError: 'People' object has no attribute 'score'

使用__slots__之后只能为对象设置name,age属性。

二、 __slots__继承

1、 子类未定义__slots__,子类不继承父类的__slots__

class Engineer(People):
    pass


if __name__ == '__main__':
    e = Engineer()
    e.score = 90
    print(e.score)  # 输出为90

2、子类定义__slots__则继承父类的__slots__

class Engineer(People):
    __slots__ = ('job',)
    pass


if __name__ == '__main__':
    e = Engineer()
    e.name = 'tester'
    e.job = 'tester'
    print(e.name, e.job) # 输出两个tester

三、__slots__优化内存

类中定义__slots__会提前分配好属性空间,而不会去使用__dict__,可以达到优化内存的效果,相应带来的问题为维护成本提高,所以一般在能确定类属性的情况下使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值