Python教程: __slots__限制类实例对象动态添加属性和方法

在Python中,slots 是一个类属性,用于限制类实例对象可以动态添加的属性和方法。通过使用 slots,你可以指定实例对象可以拥有的属性名称,从而节省内存并提高性能,同时防止意外添加未声明的属性。

使用 slots 的基本方法

定义 slots
在类定义中,将 slots 设置为一个包含属性名称的列表或元组。
限制属性:
实例对象只能拥有在 slots 中声明的属性。如果尝试添加未在 slots 中声明的属性,将会引发 AttributeError。
节省内存:
使用 slots 可以减少实例对象使用的内存,因为Python不会为每个实例对象创建一个字典来存储属性。
示例代码

class MyClass:  __slots__ = ['attr1', 'attr2']  def __init__(self, value1, value2):  self.attr1 = value1  self.attr2 = value2  # 创建一个实例对象  
obj = MyClass(10, 20)  # 访问已声明的属性  
print(obj.attr1)  # 输出: 10  
print(obj.attr2)  # 输出: 20  # 尝试添加未在 __slots__ 中声明的属性  
# obj.attr3 = 30  # 这将引发 AttributeError  # 尝试删除已声明的属性  
del obj.attr1  # 再次尝试访问已删除的属性  
# print(obj.attr1)  # 这将引发 AttributeError  # 尝试动态添加方法(这是不允许的,但不会直接由 __slots__ 阻止)  
# obj.new_method = lambda: print("Hello")  # 这不会引发错误,但方法不会绑定到类上  
# obj.new_method()  # 这将工作,但 new_method 只是一个普通函数,不是类的方法

注意事项

不能动态添加属性:
如果尝试添加未在 slots 中声明的属性,将会引发 AttributeError。
不能动态添加方法:
虽然 slots 本身不会阻止动态添加方法(因为方法是绑定到类上的函数,而不是实例对象的属性),但添加的方法不会成为类的方法,而只是普通的函数。

继承:

如果子类继承了使用 slots 的父类,子类可以定义自己的 slots,但父类的 slots 不会自动继承。如果子类需要访问父类的 slots,可以在子类的 slots 中包含父类的 slots,或者完全重新定义。
dictweakref
默认情况下,slots 会阻止实例对象拥有 dict 属性(用于存储动态属性)。如果需要实例对象拥有 dict,可以在 slots 中显式包含 ‘dict’。同样,如果需要支持弱引用,可以包含 ‘weakref’。

示例:继承与 dict

class Parent:  __slots__ = ['parent_attr']  def __init__(self, value):  self.parent_attr = value  class Child(Parent):  __slots__ = ['child_attr', '__dict__']  # 包含 '__dict__' 以允许动态属性  def __init__(self, parent_value, child_value):  super().__init__(parent_value)  self.child_attr = child_value  self.dynamic_attr = "I'm dynamic!"  # 由于 '__dict__' 的存在,这是允许的  # 创建一个子类实例对象  
child_obj = Child(100, 200)  # 访问父类和子类属性  
print(child_obj.parent_attr)  # 输出: 100  
print(child_obj.child_attr)   # 输出: 200  
print(child_obj.dynamic_attr) # 输出: I'm dynamic!

通过使用 slots,你可以更好地控制类实例对象的属性,提高代码的安全性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460497.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用AIM对SAP PO核心指标的自动化巡检监控

一、背景 由于SAP PO系统维护成本较高,各类型异常报错等都需要人员进行时刻监控和响应,遂由AIM平台进行自动化巡检SAP PO的各指标,然后告警通知用户,节省维护成本和提高工作效率 二、核心指标监控 SAP PO失败消息 适用于S…

openpnp - 手工修改配置文件(元件高度,size,吸嘴)

文章目录 openpnp - 手工修改配置文件(元件高度,size,吸嘴)概述笔记parts.xmlpackages.xml 手工将已经存在的NT1,NT2拷贝出来改名备注END openpnp - 手工修改配置文件(元件高度,size,吸嘴) 概述 载入新板子贴片准备时,除了引入Named CSV文件,还要在ope…

Centos下安装Maven(无坑版)

Linux 安装 Maven Maven 压缩包下载与解压 华为云下载源,自行选择版本 下面的示例使用的是 3.8.1 版本 wget https://repo.huaweicloud.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压 tar -zxvf apache-maven-3.8.1-bin.tar.gz移…

算法:排序

排序算法 1. 简单排序1.1 直接插入排序1.2 冒泡排序1.3 简单选择排序 2. 希尔排序3. 快速排序4. 堆排序5. 归并排序 将文件的内容按照某种规则进行排列。 排序算法的稳定判定:若在待排序的一个序列中, R i R_i Ri​和 R j R_j Rj​的关键码相同&#xf…

Topaz Photo AI for Mac人工智能图像降噪软件 安装教程【保姆级教程,简单操作轻松上手】

Mac分享吧 文章目录 Topaz Photo AI for Mac人工智能图像降噪软件 安装完成,软件打开效果一、Topaz Photo AI 人工智能图像降噪软件 Mac电脑版——v3.3.0⚠️注意事项:1️⃣:下载软件2️⃣:安装软件,根据步骤完成操作…

k8s部署redis远程连接示例

一、环境 节点 IP 服务 master 192.168.126.46 docker、kubeadm、kubelet、kubectl、flannel、telnet node1 192.168.126.47 docker、kubeadm、kubelet、kubectl、flannel、telnet node2 192.168.126.48 docker、kubeadm、kubelet、kubectl、flannel、telnet ubunt…

ubuntu内核更新导致显卡驱动掉的解决办法

方法1,DKMS指定内核版本 用第一个就行 1,借鉴别人博客解决方法 2,借鉴别人博客解决方法 方法2,删除多于内核的方法 系统版本:ubuntu20.24 这个方法是下下策,如果重装驱动还是不行,就删内核在…

Apache Hive分布式容错数据仓库系统

Apache Hive™是一个分布式的、容错的数据仓库系统,它支持大规模的分析,并使用SQL方便地读取、写入和管理驻留在分布式存储中的pb级数据。 Apache Hive Apache Hive是什么 Apache Hive是一个分布式的、容错的数据仓库系统,支持大规模的分析…

运用AI视频拍摄技术生成3D场景:适用于建模、XR及文旅项目Demo制作

利用AI技术从拍摄的视频中生成3D场景,这种创新方法非常适合用于快速构建高质量的3D模型。生成的3D场景不仅能够用于建筑和设计行业的模型展示,还能应用于扩展现实(XR)技术的大空间体验开发。此外,在文化旅游领域&#…

论文提交步骤 | 2024年第五届MathorCup大数据竞赛

2024年第五届MathorCup数学应用挑战赛—大数据竞赛于2024年10月25日下午6点正式开赛。 论文和承诺书、支撑材料(可选)及计算结果文档由各参赛队队长电脑登录下方报名主页提交: https://www.saikr.com/vse/bigdata2024 初赛作品提交截止时间为…

11-Dockerfile

11-Dockerfile Dockerfile Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤: 编写Dockerfile文件docker build命令构建镜像docker run依据镜像运行容器实例 构建过程 Dockerfile编写&#xff1a…

如何合并几个pdf文件?值得推荐几个PDF文件的方法

如何合并几个pdf文件?这些PDF文件既是智慧的宝库,也是错综复杂的迷宫,它们如同夜空中散落的繁星,虽然各自闪耀,却因缺乏联系而难以汇聚成照亮前行之路的璀璨星河。当我们急需从这片信息的海洋中捕捞到关键的智慧珍珠时…

rabbitmq高级特性(2)TTL、死信/延迟队列、事务与消息分发

目录 1.TTL 1.1.设置消息过期时间 1.2.设置队列过期时间 2.死信队列 2.1.介绍 2.2.演示 3.延迟队列 3.1.模拟实现延迟队列 3.2.延迟队列插件 4.事务与消息分发 4.1.事务 4.2.消息分发 1.TTL 所谓的ttl,就是过期时间。对于rabbitmq,可以设置…

Java集合常见面试题总结(5)

HashSet 如何检查重复? 当你把对象加入HashSet时,HashSet 会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发…

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制(Replication)1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念:复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…

测试管理|如何做好质量管理、提高研发的代码质量?

以下为作者观点: 起因是领导一直在提的一个观点:测试不能只测试系统,重点要放到质量管理上,要管理、监督研发的开发质量。 公司是乙方,接项目过日子,算是外包企业吧。项目时间一般都比较紧张(…

QT项目-仿QQ聊天(带宠物系统)

目录 一,项目介绍 二,开发环境 三,涉及技术 四,项目效果示例图 1,登录界面 2,主界面 3,聊天界面 4,功能界面 5,宠物界面 一,项目介绍 这是一个基于u…

vue打包项目通过docker部署nginx服务

一、构建前端代码 npm install nmp run build 确认自己的打包路径,默认是dist,这里也可以修改。 二、将打包的项目使用dockerfile构建 dockerfile 将dist文件复制到nginx的指定的路径,前端界面的路径,还需要两个conf文件 FR…

数据分析与效果评估的有效方法与实践探讨

内容概要 在现代社会中,数据分析与效果评估已成为各类项目管理和决策制定中的重要组成部分。首先,数据分析为我们提供了一种系统化的方法,以深入了解所收集数据的内涵与趋势。通过对数据进行整理、分类和分析,我们能够发现潜在的…

【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)

文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…