python类的__slots__方法
由于Python是动态语言,任何实例在运行期都可以动态地添加属性。比如:
class Student(object): def __init__(self, name, gender, score): self.name = name self.gender = gender self.score = score
此时,Student类有三个属性,name、gender、score,由于是动态语言,在运行时,可以随意添加属性。
student = Student('Bob', 'Male', 99)
student.age = 12 # ==> 动态添加年龄age属性
如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利用Python的一个特殊的__slots__来实现。
class Student(object): __slots__ = ('name', 'gender', 'score') def __init__(self, name, gender, score): self.name = name self.gender = gender self.score = score
使用__slots__ = ('name', 'gender', 'score') 限定Student类的属性,这个时候在外部再次添加动态属性age,将会报错。
>>> student = Student('Bob', 'Male', 99) >>> student.age = 12 # ==> 动态添加年龄age属性 Traceback (most recent call last): AttributeError: 'Student' object has no attribute 'age'
__slots__的目的是限制当前类所能拥有的属性,避免因为外部属性的操作导致类属性越来越难以管理。
import types class Person(object): __slots__ = ("name", "age") # 定义__slots__ def __init__(self, newName, newAge): self.name = newName self.age = newAge def eat(self): print("---正在吃---") def run(self): print("---正在跑---") Person.num = 100 # 类Person动态添加类属性num zhangsan = Person("张三", 18) print(zhangsan.name) # 张三 print(zhangsan.age) # 18 print(zhangsan.num) # 100 zhangsan.eat() # ---正在吃--- zhangsan.addr = "北京" # 'Person' object has no attribute 'addr' zhangsan.run = types.MethodType(run, zhangsan) # 'Person' object has no attribute 'run'
通过以上代码可知,__slots__对Person类的动态添加没有限制,而Person类对象zhangsan不能再动态添加对象属性和方法。
对于__slot__有以下几个需要注意的地方:
- __slots__只对类对象进行限制,不对类进行限制
- __slots__不仅限制类对象的属性,还限制类对象的方法
- __slots__仅对当前类起作用,对继承的子类不起作用
- 在子类中定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的__slots__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-07-13 什么是 Prometheus