__slots__
2022/5/5 6:13:14
本文主要是介绍__slots__,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
- 我们在使用类的时候,常规做法是会先实例化一个该类的对象,然后可以为此实例对象动态的添加实例方法或者实例属性
- __slots__属性就相当于是一个白名单,只有在白名单中才可以添加
需要注意
- 对于类,Python允许为类动态地添加这三种方法(实例方法、静态方法和类方法)
- 对于实例对象,则Python只允许动态地添加实例方法,不能添加类方法和静态方法
- 为单个实例对象添加方法,不会影响该类的其它实例对象
- 为类动态地添加方法或更改,则会影响所有的实例对象。
__ slots__
__ slots__ 只能限制为实例对象动态添加属性和方法,而无法限制动态地为类添加属性和方法。
class Slots: __slots__ = ("name", "info") def test(self): print("This is Test") def info(self, name): print("正在调用实例方法", self.name) slots = Slots() slots.test() slots.name = 'Jim' print(slots.name) slots.info = info slots.info(slots, "Tom") slots.age = 15 print(slots.age)
运行结果:
This is Test Jim 正在调用实例方法 Jim Traceback (most recent call last): File "tests.py", line 101, in <module> slots.age = 15 AttributeError: 'Slots' object has no attribute 'age'
另外,__ slots__ 属性限制的对象是类的实例对象,而不是类,因此下面的代码是合法的:
Slots.age = 15 print(Slots.age) 运行结果: 15
作用域
此外,__ slots__ 属性对由该类派生出来的子类,是不起作用的。例如如下代码:
class CLanguage: __slots__ = ('name','add','info') #Clanguage 的空子类 class CLangs(CLanguage): pass #定义的实例方法 def info(self): print("正在调用实例方法") clang = CLangs() #为子类对象动态添加 say() 方法 clang.say = info clang.say(clang) ### 运行结果: 正在调用实例方法
总结
所以,__ slots__ 属性只对当前所在的类起限制作用。
此外,如果子类也要限制外界为其实例对象动态地添加属性和方法,必须在子类中设置 __ slots__ 属性。那么子类实例对象允许动态添加的属性和方法,是子类中 __ slots__ 属性和父类 __ slots__ 属性的和。
这篇关于__slots__的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-06小米11i印度快充版ROM合集:极致体验,超越期待
- 2024-10-06【ROM下载】小米11i 5G 印度版系统, 疾速跃迁,定义新速度
- 2024-10-06【ROM下载】小米 11 青春活力版,青春无极限,活力全开
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求