python作为一门动态语言,可以在对象创建后动态的添加属性和方法。

示例1:动态添加属性

class Dog(object):def __init__(self, name, age):self.name = nameself.age = agedog = Dog('ahuang', 10)
dog.home = 'China'    # 直接外部定义
print(dog.home)

示例2:动态添加属性

class Dog(object):def __init__(self, name, age):self.name = nameself.age = agedef love(self, value):   # 定义外部函数self.favorite = valueprint(f"The dog loves {value}")from types import MethodType
dog.love = MethodType(love, dog)     # 通过MethodType将外部函数绑定到对象上print(dog.love)   # <bound method love of <__main__.Dog object at 0x7f8dcc4a7790>>
print(dog.favorite)   # 'meat'

动态语言的特性无疑增加了python语言的灵活性,但也带来了风险:暴露的对象可以被用户任意恶意添加属性。而类的__slots__属性提供了一种解决方案:

示例3:定义__slots__属性

class Dog_slot(object):__slots__ = ['name', 'age']def __init__(self, name, age):self.name = nameself.age = agedog_slot = Dog_slot('ahuang', 10)
dog_slot.home = 'China'    # 直接报错:AttributeError: 'Dog' object has no attribute 'home'

在上面的Dog类中直接申明了所有的属性,因此无法定义其他的属性(无论是内部定义还是外部绑定!)

除了无法定义新的属性外,在定义__slots__后,还有一个额外的好处:节省内存空间,因为此时对象没有了__dict__属性,而会增加__slots__。因为__slots__是静态的,而非__dict__支持动态添加,因此对象会节省memory。

因此,当事先确定好class的所有attributes时候,建议使用slots来节省memory以及获得更快的attribute access。此外,不应当机械的为了防止创造__slots__之外的新属性作为使用__slots__的原因。

在__slots__的使用,还需要注意如下几点:
(1)父类定义了__slots__, 子类没定义__slots__,则子类会完全继承父类的__slots__以及__slots__中定义的属性。同时会生成__dict__属性,因此仍可以动态添加新的属性;
(2)父类定义了__slots__,子类中定义了新的__slots__,则子类会继承父类的__slots__中涉及的相关属性,而__slots__中只保留新定义的属性;
(3)父类定义了__slots__,子类中定义的__slots__与父类有重复,则作为重复项处理;
(4)如果为多继承关系,且父类的各__slots__(若定义了的话)不一致,则会报错。

【Reference】

  1. 如何理解和使用python里的__slots__?
  2. usage-of-slots

【python进阶】类的__slots__属性相关推荐

  1. Python进阶-----类、对象的相关知识

    一.声明类 class 类名: #一般类名的首字母大写 '类的文档字符串' 类体 例如创建一个中国人的类: 1 class Chinese: 2 '这是一个中国人的类' #类的文档字符串 3 name ...

  2. Python进阶-----类的继承顺序

    python的类可以继承多个类,如果继承多个类,那么其寻找方法的方式有:深度优先和广度优先 基类或者父类继承了object类,那么该类就是新式类,否则便是经典类 当类是经典类时,多继承情况下,会按照深 ...

  3. python的类里的属性是否可以为列表_Python中如何获取类属性的列表

    前言 最近工作中遇到个需求是要得到一个类的静态属性,也就是说有个类 Type ,我要动态获取 Type.FTE 这个属性的值. 最简单的方案有两个: getattr(Type, 'FTE') Type ...

  4. python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、

    常规情况下,类的属性字典是共享的,而实例的字典是独立的.如果一个类的属性较少,但是拥有很多的实例,这些实例的属性字典会占用较多的内存空间.对这样的类来说,为了节省内存空间,可以使用__slots__类 ...

  5. python的类里的属性是否可以为列表_是否有Python方法可以访问类的所有非私有和非内置属性?...

    我想调用一种方法给我一个所有"非私有"的词典(我在这里使用"私有"一词,因为它在 Python中并不存在)和非内置属性(即那些在类上不要以单个或双下划线开头.像 ...

  6. python关于类的slots属性

    1.__ slots__属性 __ slots__ allow us to explicitly declare data members (like properties) and deny the ...

  7. python:小心类实例的属性动态绑定机制

    为什么80%的码农都做不了架构师?>>>    class Test:def __init__(self):self.__key='init'def get_key(self):re ...

  8. Python自定义类中定义属性的两种方式

    封面图片:<Python程序设计开发宝典>,ISBN:9787302472100,董付国,清华大学出版社 图书详情:https://item.jd.com/12143483.html 京东 ...

  9. python的`__slots__`属性

    1. 引言 我们先看一个问题: 对象(通过类实例化后的对象)如何储存自己的属性? 1.1. 默认情况下:对象如何储存自己的属性 为了说明这个问题, 我们先在交互式模式中做一个简单的测试: >&g ...

最新文章

  1. 安装深度linux无法引导,安装deepin无法引导,求教!
  2. 2021高考一诊成绩查询,双流棠湖中学高2021届成都市“一诊”成绩已揭晓
  3. oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!
  4. linux打开二进制文件后终端乱码处理
  5. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...
  6. Java线程学习笔记(两) 线程异常处理
  7. js图片无刷新上传,预览
  8. 状态良好(恢复分区)空间的删除的方法
  9. c语言三种结构化程序设计方法,C语言中用于结构化程序设计的三种基本结构是什么...
  10. 飞秋与虚拟机的有关IP设置
  11. 服务端接入验证苹果支付receipt
  12. C# 控件透明背景(winform)
  13. 哈特曼医用音叉行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  14. chatgpt赋能python:Python中cwd的介绍与使用
  15. 【快速因数分解】Pollard's Rho 算法
  16. 鸿蒙时代实力排名,鸿蒙时期神魔不敢进入四大禁区,九天银河上榜,第一堪称黑暗禁地...
  17. python公司分析_Python分析6000家破产IT公司
  18. 某杭州女人的择偶标准
  19. Spring的注解@Bean
  20. 摘录 | 《十二个圣诞故事》

热门文章

  1. HTML中的 nbsp; ensp; emsp;等6种空格标记
  2. 商标转让流程 中国商标转让 海外商标转让
  3. hdu 1071 The area(定积分求面积)
  4. sqlserver中将多列_如何在Excel中将一个长列变成多个列
  5. 802.11基础——术语及缩略语
  6. 2023年天津理工大学中环信息学院专业课考试具体安排
  7. 【转】3-4岁幼儿生理心理发展特点
  8. java中怎么检测ip_Java检测IP地址输入是否正确
  9. 突破重围,攻“新”为上!凯里亚德与郁锦香酒店以创新势能获投资者青睐
  10. cancelbubble和stoppraopagation区别