python __slots__

url https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000

一个没见过的属性,限制实例随意扩展,只对当前实例有效


使用slots
但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性:

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

然后,我们试试:

 s = Student() # 创建新的实例
 s.name = 'Michael' # 绑定属性'name'
 s.age = 25 # 绑定属性'age'
 s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

由于'score'没有被放到slots中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

class GraduateStudent(Student):
...     pass
...
g = GraduateStudent()
g.score = 9999

除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,355评论 19 139
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,506评论 0 6
  • 最近因为被迫要收拾家中的全部物品,只留下一小部分,我面临人生前所未有的判断难题。 起初,我给自己定的计划是,今天小...
    教在美国阅读 7,391评论 18 30
  • 1. 命令行切换到root用户 备注:ubuntu默认root用户没有设置密码,切换需要首先设置密码 sudo p...
    大牧莫邪阅读 5,462评论 22 3