【python进阶】类的__slots__属性
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】
- 如何理解和使用python里的__slots__?
- usage-of-slots
【python进阶】类的__slots__属性相关推荐
- Python进阶-----类、对象的相关知识
一.声明类 class 类名: #一般类名的首字母大写 '类的文档字符串' 类体 例如创建一个中国人的类: 1 class Chinese: 2 '这是一个中国人的类' #类的文档字符串 3 name ...
- Python进阶-----类的继承顺序
python的类可以继承多个类,如果继承多个类,那么其寻找方法的方式有:深度优先和广度优先 基类或者父类继承了object类,那么该类就是新式类,否则便是经典类 当类是经典类时,多继承情况下,会按照深 ...
- python的类里的属性是否可以为列表_Python中如何获取类属性的列表
前言 最近工作中遇到个需求是要得到一个类的静态属性,也就是说有个类 Type ,我要动态获取 Type.FTE 这个属性的值. 最简单的方案有两个: getattr(Type, 'FTE') Type ...
- python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、
常规情况下,类的属性字典是共享的,而实例的字典是独立的.如果一个类的属性较少,但是拥有很多的实例,这些实例的属性字典会占用较多的内存空间.对这样的类来说,为了节省内存空间,可以使用__slots__类 ...
- python的类里的属性是否可以为列表_是否有Python方法可以访问类的所有非私有和非内置属性?...
我想调用一种方法给我一个所有"非私有"的词典(我在这里使用"私有"一词,因为它在 Python中并不存在)和非内置属性(即那些在类上不要以单个或双下划线开头.像 ...
- python关于类的slots属性
1.__ slots__属性 __ slots__ allow us to explicitly declare data members (like properties) and deny the ...
- python:小心类实例的属性动态绑定机制
为什么80%的码农都做不了架构师?>>> class Test:def __init__(self):self.__key='init'def get_key(self):re ...
- Python自定义类中定义属性的两种方式
封面图片:<Python程序设计开发宝典>,ISBN:9787302472100,董付国,清华大学出版社 图书详情:https://item.jd.com/12143483.html 京东 ...
- python的`__slots__`属性
1. 引言 我们先看一个问题: 对象(通过类实例化后的对象)如何储存自己的属性? 1.1. 默认情况下:对象如何储存自己的属性 为了说明这个问题, 我们先在交互式模式中做一个简单的测试: >&g ...
最新文章
- 安装深度linux无法引导,安装deepin无法引导,求教!
- 2021高考一诊成绩查询,双流棠湖中学高2021届成都市“一诊”成绩已揭晓
- oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!
- linux打开二进制文件后终端乱码处理
- 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...
- Java线程学习笔记(两) 线程异常处理
- js图片无刷新上传,预览
- 状态良好(恢复分区)空间的删除的方法
- c语言三种结构化程序设计方法,C语言中用于结构化程序设计的三种基本结构是什么...
- 飞秋与虚拟机的有关IP设置
- 服务端接入验证苹果支付receipt
- C# 控件透明背景(winform)
- 哈特曼医用音叉行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- chatgpt赋能python:Python中cwd的介绍与使用
- 【快速因数分解】Pollard's Rho 算法
- 鸿蒙时代实力排名,鸿蒙时期神魔不敢进入四大禁区,九天银河上榜,第一堪称黑暗禁地...
- python公司分析_Python分析6000家破产IT公司
- 某杭州女人的择偶标准
- Spring的注解@Bean
- 摘录 | 《十二个圣诞故事》
热门文章
- HTML中的 nbsp; ensp; emsp;等6种空格标记
- 商标转让流程 中国商标转让 海外商标转让
- hdu 1071 The area(定积分求面积)
- sqlserver中将多列_如何在Excel中将一个长列变成多个列
- 802.11基础——术语及缩略语
- 2023年天津理工大学中环信息学院专业课考试具体安排
- 【转】3-4岁幼儿生理心理发展特点
- java中怎么检测ip_Java检测IP地址输入是否正确
- 突破重围,攻“新”为上!凯里亚德与郁锦香酒店以创新势能获投资者青睐
- cancelbubble和stoppraopagation区别