Python __slots__限制动态添加变量
Python是一种非常灵活的动态语言,有时感觉太灵活以至于不知道遵循什么样的规则去驾驭。不过Python已经是非常完备的语言,想实现什么样的功能都是有方法的,而且也很容易,比如限制一个类动态添加成员变量。
一般情况下,我们定义完一个类,如果不加任何限制,还可以动态地为该类的对象或该类添加成员变量。
class Employee:def __init__(self,name=''):self.name = nameif __name__ == "__main__":try:employee1 = Employee('Bob')#动态为一个对象添加成员变量employee1.tel = '11111111'print(employee1.name,employee1.tel)employee2 = Employee('Tom')#employee2对象没有tel成员变量print(employee2.name,employee2.tel)except AttributeError as e:print(e)#动态为一个类添加成员变量Employee.tel = []print(employee2.name,employee2.tel)#Bob 11111111
#'Employee' object has no attribute 'tel'
#Tom []
看起来很方便,不过如果我们如果不想使用者破坏类的结构、随便添加成员变量,要怎么做呢?
答案是,可以使用__slots__
对象。
在类中,__slots__
是一个以元组形式被定义的,只有在元组里的属性,才可以被赋值,不在元组里的属性赋值时会报错。
class Employee:__slots__ = ('name')def __init__(self,name=''):self.name = nameif __name__ == "__main__":employee1 = Employee('Bob')#动态为一个对象添加成员变量,但不在__slots__定义的元组内,会报异常employee1.tel = '11111111'print(employee1.name,employee1.tel)#AttributeError: 'Employee' object has no attribute 'tel'
__solts__
不能被子类继续,如果想限制子类的成员变量,子类也要定义__slots__
变量,同时会继承父类的__slots__
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Employee:__slots__ = ('name')def __init__(self,name=''):self.name = nameclass Manager1(Employee):pass
class Manager2(Employee):__slots__ = ('addr')if __name__ == "__main__":manager1 = Manager1('Bill')#动态为一个对象添加成员变量manager1.tel = '22222222'print(manager1.name,manager1.tel)manager2 = Manager2()manager2.name = 'David'manager2.addr = 'BJ'print(manager2.name,manager2.addr)#动态为一个对象添加成员变量,不在__slots__里,会报异常manager2.tel = '33333333'print(manager2.tel)#Bill 22222222
#David BJ
#AttributeError: 'Manager2' object has no attribute 'tel'
如果想进一步限制对成员变量的使用,可以重载__setattr__
, __getattr__
,__getattribute__
函数,__setattr__
函数可以在赋值前拦截;__getattr__
在找不到属性时被调用;__getattribute__
则在获取属性值时无条件被调用,同时__getattr__
不再被调用。注意不要在__getattribute__
里使用self.attr来访问变量,这会导致无限递归循环。
class Employee:__slots__ = ('name')def __init__(self,name=''):self.name = nameclass Manager2(Employee):__slots__ = ('addr')def __setattr__(self,name,value):if name == 'tel':raise AttributeError('manager has no tel')object.__setattr__(self, name, value)def __getattr__(self,name):if name == 'tel':return 0object.__getattribute__(self, name)
if __name__ == "__main__":manager2 = Manager2('Jone')manager2.name = 'David'manager2.addr = 'BJ'try:manager2.tel = '11111111'except Exception as e:print(e)print(manager2.name,manager2.addr,manager2.tel)#manager has no tel
#David BJ 0
Python __slots__限制动态添加变量相关推荐
- python笔记30-docstring注释添加变量
前言 python里面添加字符串注释非常简单,如何将变量放入 python 的函数注释里面呢? docstring也就是给代码加注释的内容了,python可以给函数,类.方法,模块添加注释内容,注释标 ...
- python在路径里添加变量_想学Python?那就先从头开始吧!
作为人工智能和大数据时代最具竞争力的 Python 语言,越来越多的出现在各大编程热搜排行榜上. 首先你要了解什么是python 了解Python语言 Python是一种解释型, 面向对象, 动态数据 ...
- python for循环动态定义变量
for k in range(5):exec(f'cat_{k} = k*2')
- python类的成员函数_Python为类对象动态添加成员函数
Python: 为对象动态添加函数 , 且函数定义 来自一个 str 在 Python 中 , 通常情况下 , 你只能为对象添加一个已经写好的方法 需求 : 传入一个 str 类型的变量 , 其值是一 ...
- python接口自动化测试框架(post提交添加变量)
1.python接口测试框架包含哪几部分 数据源-> GET/POST 发送请求->接收返回结果->断言测试结果->生成测试报告(html报告)->网页报告 2.pyth ...
- 我的Python学习笔记(四):动态添加属性和方法
一.动态语言相关概念 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C# ...
- 【转载】 Python动态生成变量
用Python循环创建多个变量, 如创建 a1= .a2= .a3= .a4= .a5= 或 self.a1= .self.a2= . self.a3= 一. 可以通 ...
- python类的属性和对象属性_在python的类中动态添加属性与生成对象
本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...
- python3动态生成变量_【转载】 Python动态生成变量
用Python循环创建多个变量, 如创建 a1= .a2= .a3= .a4= .a5= 或 self.a1= .self.a2= . self.a3= 一. 可以通 ...
最新文章
- 《JavaScript设计模式》——11.2 一切只因跨域
- 通向人工智能产业落地化的道路在哪?
- 三星手机怎么恢复删除的图片_手机相册照片突然删除了怎么恢复?这个方法好用...
- eclipse做java_在Eclipse中使用Java 12
- Leetcode 25 K个一组翻转链表 (每日一题 20210719)
- 日期型转json格式(springboot)
- ACL 2020 | 用于链接预测的开放知识图谱嵌入
- orcle抽数据到mysql_抽取oracle数据到mysql数据库的实现过程
- 机器学习java_如何开始使用Java机器学习
- 您已从远程计算机注销,您无法从 Windows Server 2008 R2 中的远程桌面会话注销
- 面经 |算法工程师面试题汇总分享
- hazelcast 搭建_hazelcast Management Center 源码分析
- Unity3D休闲射击类游戏《Survival Shooter》完整源码
- Maximal submatrix
- 运动模糊 motion blur
- Opencv 3入门(毛星云)摘要
- HDOJ 1069 Monkey and Banana 解题报告
- 基于JAVA的远程屏幕监控系统
- Windows系统常用工具,支持windows7 vista
- 达内python培训质量怎么样