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__限制动态添加变量相关推荐

  1. python笔记30-docstring注释添加变量

    前言 python里面添加字符串注释非常简单,如何将变量放入 python 的函数注释里面呢? docstring也就是给代码加注释的内容了,python可以给函数,类.方法,模块添加注释内容,注释标 ...

  2. python在路径里添加变量_想学Python?那就先从头开始吧!

    作为人工智能和大数据时代最具竞争力的 Python 语言,越来越多的出现在各大编程热搜排行榜上. 首先你要了解什么是python 了解Python语言 Python是一种解释型, 面向对象, 动态数据 ...

  3. python for循环动态定义变量

    for k in range(5):exec(f'cat_{k} = k*2')

  4. python类的成员函数_Python为类对象动态添加成员函数

    Python: 为对象动态添加函数 , 且函数定义 来自一个 str 在 Python 中 , 通常情况下 , 你只能为对象添加一个已经写好的方法 需求 : 传入一个 str 类型的变量 , 其值是一 ...

  5. python接口自动化测试框架(post提交添加变量)

    1.python接口测试框架包含哪几部分 数据源-> GET/POST 发送请求->接收返回结果->断言测试结果->生成测试报告(html报告)->网页报告 2.pyth ...

  6. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言相关概念 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C# ...

  7. 【转载】 Python动态生成变量

    用Python循环创建多个变量, 如创建 a1=   .a2=   .a3=   .a4=   .a5=    或  self.a1=    .self.a2=   . self.a3= 一. 可以通 ...

  8. python类的属性和对象属性_在python的类中动态添加属性与生成对象

    本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...

  9. python3动态生成变量_【转载】 Python动态生成变量

    用Python循环创建多个变量, 如创建 a1=   .a2=   .a3=   .a4=   .a5=    或  self.a1=    .self.a2=   . self.a3= 一. 可以通 ...

最新文章

  1. 《JavaScript设计模式》——11.2 一切只因跨域
  2. 通向人工智能产业落地化的道路在哪?
  3. 三星手机怎么恢复删除的图片_手机相册照片突然删除了怎么恢复?这个方法好用...
  4. eclipse做java_在Eclipse中使用Java 12
  5. Leetcode 25 K个一组翻转链表 (每日一题 20210719)
  6. 日期型转json格式(springboot)
  7. ACL 2020 | 用于链接预测的开放知识图谱嵌入
  8. orcle抽数据到mysql_抽取oracle数据到mysql数据库的实现过程
  9. 机器学习java_如何开始使用Java机器学习
  10. 您已从远程计算机注销,您无法从 Windows Server 2008 R2 中的远程桌面会话注销
  11. 面经 |算法工程师面试题汇总分享
  12. hazelcast 搭建_hazelcast Management Center 源码分析
  13. Unity3D休闲射击类游戏《Survival Shooter》完整源码
  14. Maximal submatrix
  15. 运动模糊 motion blur
  16. Opencv 3入门(毛星云)摘要
  17. HDOJ 1069 Monkey and Banana 解题报告
  18. 基于JAVA的远程屏幕监控系统
  19. Windows系统常用工具,支持windows7 vista
  20. 达内python培训质量怎么样

热门文章

  1. 分析决策树算法和逻辑回归算法的不同之处
  2. 如何让人工智能更加实际的辅助网络安全
  3. [摘录]高效人士七习惯—从依赖到独立
  4. java jdk 1.8 配置_java_Day01: java的jdk环境变量配置(1.8)
  5. python学号怎么编写_用python编写学生管理系统
  6. 【学习笔记】SAP Fiori相关概念介绍
  7. 【ABAP】OO ALV 概述
  8. SAP SD:SAP信贷出口
  9. 定义工厂(Plant)
  10. CDS – One Concept, Two Flavors