第8.20节 Python中限制动态定义实例属性的白名单:__slots__

openclaw安装与lovart变现:从命令行技能到微型SaaS的实战路径 openclaw是一种面向自然语言指令的本地化技能执行框架,其核心原理是通过YAML定义的skill文件驱动隔离式运行时执行Python/Shell逻辑,实现‘意图-槽位-上下文’解析;这种设计使它超越传统CLI工具,成为可组合、可调试、可复用的轻量级技能操作系统。技术价值在于将重复性操作封装为标准化能力单元,支撑自动化流水线构建;典型应用场景包括会议纪要提炼、PDF智能批注、Excel数据清洗等生产力任务。而lovart并非功能增强工具,而是基于openclaw构建的服务化封装层,通过API映射、数字签名 阅读详情

一、 引言
按照《第7.10节 Python类中的实例变量定义与使用》、《第7.14节Python类中的实例方法解析》中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该实例动态增加任何属性和方法。但实际上,Python中的类可以控制哪些属性可以增加,这个就类似于一个可以动态增加属性的白名单。这个白名单就定义在类的特殊实例变量__slots__中。
二、 slots
__slots__这个特殊变量在object类中是没有定义的,因此如果使用必须在自定义类中单独定义,并且必须是类变量,不能是实例变量。常规定义的语法如下:
slots = (变量名1,变量名2,…)
slots = [变量名1,变量名2,…]
…

由于__slots__是类变量,因此最好放在类体代码中定义,其中的变量数可以是1到多个。使用第一种方式,当变量是1个时,__slots__自身是字符串类型,当变量是多个时,它是元组类型;使用第二种方式,类变量__slots__类型为列表。实际上__slots__可赋值为字符串、可迭代对象或由实例使用的变量名构成的字符串序列,任何非字符串可迭代对象都可以被赋值给 slots。映射也可以被使用,在此不展开介绍每种赋值方式。
三、 __slots__的作用

  1. slots 允许开发人员显式地声明限定的数据成员(例如特征属性),禁止未声明的成员动态加入;
  2. 这个 slots 会为已声明的变量保留空间,并阻止自动为每个实例创建 dict 和 __weakref_特殊变量(除非是在 slots 中显式地声明或是在父类中可用)。
  1. 而当继承自一个未定义 slots 的类时,实例的 dict 和 weakref 属性将总是可访问;
  2. 没有 dict 变量,实例就不能给未在 slots 定义中列出的新变量赋值。尝试给一个未列出的变量名赋值将引发 AttributeError。新变量需要动态赋值,就要将 ‘dict’ 加入到 slots 声明的字符串序列中。
  3. 如果未给每个实例设置 weakref 变量,定义了 slots 的类就不支持对其实际的弱引用。如果需要弱引用支持,就要将 ‘weakref’ 加入到 slots 声明的字符串序列中。
  1. 使用__slots__相比使用 dict 方式可以显著地节省空间。 属性查找速度也可得到显著的提升;
  2. slots 声明的作用不只限于定义它的类。在父类中声明的 slots 在其子类中同样可用。不过,子类将会获得 dict 和 weakref 除非它们也定义了 slots (其中应该仅包含对任何 额外 名称的声明位置)。
  3. 非空的 slots 不适用于派生自“可变长度”内置类型例如 int、bytes 和 tuple 的派生类;
  4. __ slots__只能在类体代码中赋值,赋值后:
  1. 不能通过类体外使用“实例名.__ slots__”方式重新赋值,Python会报该属性只读;
  2. 不能在实例方法中和类体外代码中使用“类名.__ slots__” 方式赋值,赋值时不会报错,但__ slots__不起作用,如实例中__dict__会自动创建,如果类体中原来已经定义了__slots__,在实例方法中修改__slots__,可以修改,但Python还是只允许类体中定义的__ slots__中限定的属性添加。
  1. 定义了__ slots__后,如果在代码中定义__ slots__外的实例变量,则会报AttributeError错误;
  2. __ slots__定义以后,在实例方法含构造方法中都不能新定义__ slots__外的其他实例变量。

四、 三个案例

  1. 源代码如下:
    #案例1:#使用实例方法来定义类变量Vehicle.__slots__没有作用
class Vehicle(): 
   def __init__(self,power):
       self.power = power
       Vehicle.__slots__ = ['power']
v=Vehicle('人力')
v.wheelcount=4 #加一个实例变量不会拦截
v.__dict__  #服务字典中的自定义属性成功

#案例2:#使用类体来定义类变量__slots__可以正常发挥作用

class Vehicle(): 
   __slots__ = ['power']
   def __init__(self,power):
       self.power = power
       
v=Vehicle('人力')
v.wheelcount=4 #加一个实例变量会拦截
v.__dict__  #没有字典属性      

#案例3:#定义类变量__slots__后在类体外修改,可以修改但修改不起作用

class Vehicle(): 
   __slots__ = ['power','weight']
   def __init__(self,power):
       self.power = power
       
v=Vehicle('人力')
Vehicle.__slots__ = ['wheelcount','oilcost']
Vehicle.__slots__ #显示赋值被修改
v.wheelcount=4 #加一个实例变量会拦截
v.__dict__  #没有字典属性
  1. 执行截屏:

本节介绍了特殊变量__slots__的定义和使用以及注意事项,并举例进行了说明,通过介绍可以知道,__slots__相当于是一个实例变量的白名单。

老猿Python,跟老猿学Python!
博客地址:https://blog.youkuaiyun.com/LaoYuanPython

请大家多多支持,点赞、评论和加关注!谢谢!

GLM-5驱动的飞书AI工作流:10分钟零代码部署实践 大模型工作流是指利用大语言模型理解业务意图并自动编排API调用的技术范式。其核心原理在于将自然语言指令映射为结构化动作,依赖模型语义理解能力与系统集成能力的双重支撑。技术价值体现在显著降低AI应用门槛,使非技术人员也能快速构建自动化任务。典型应用场景包括跨SaaS数据同步、多维表格智能维护、审批流增强等企业高频协作需求。当前主流方案仍受限于模型中文理解深度与部署复杂度,而GLM-5凭借专优化的中文Few-shot能力与OpenClaw封装的飞书原生Bot机制,实现了从指令解析到Webhook直连的全链路压缩 阅读详情

相关推荐

Nanobot轻量AI代理:可审计、可调试、可复现的本地化实践指南

AI代理本质上是连接大语言模型与操作系统能力的执行层,其核心原理在于消息解析、工具调度与状态管理。技术价值不在于参数规模或云原生兼容性,而在于开发者能否在5分钟内定位故障、理解每行命令的执行路径,并确保所有IO行为完全可控。这直接支撑起三类关键应用场景:安全敏感型系统集成(如金融/医疗后端)、教学演示(向学生直观展示LLM如何调用grep或curl)、以及边缘/低功耗设备部署(树莓派、老款MacBook)。Nanobot正是这一理念的工程实现——它用Python 3.11的结构化匹配、文件系统级Statef

377

Python —— pickle序列化(大量数据提高python读写速度)(pkl文件)

当大量数据的时候,保存成pkl序列化文件的格式,能够加快python的读写速度 pickle的功能就是把你上次计算得到的数据保存起来,当你需要使用这些数据时,直接通过load将数据进行恢复,这样的好处有: 不需要重新去计算得到数据,节省计算机资源; 可以更好的被内存调用,不需要经过数据格式的转换,提高效率;【直接保存为其他格式,如txt、csv的数据读写速度都不如序列化后的数据(字节流)】 pickle可以保存多个对象。实验中,同一数据集下需要保存的内容不止............

hxxjxw的博客 6091

Python中限制动态定义实例属性的白名单:__slots__

这种动态性是Python语言的一大特点,但有时候我们希望限制对象的属性,只允许定义在一个预定义的白名单中。属性提供了一种限制对象属性的机制,只允许定义在白名单中的属性。这不仅可以避免意外地定义错误的属性,还可以节省内存空间并提高属性访问的速度。属性时,Python就不再为实例对象分配这个字典,而是使用一个更紧凑的数据结构来存储属性。属性是一个类属性,它定义了一个属性名称的列表。属性,那么它将拥有父类和子类中定义的所有属性。列表中的属性,而不能动态地定义其他属性。属性,但它们各自的属性是独立的。

TechGlide的博客 134

python白名单验证-Python中XSS白名单过滤的实现

在Web开发中很多地方需要用户输入富文本但又要确保输入的这些内容绝对安全不会引发XSS漏洞,那么最常用的技术就是白名单技术。白名单的通常做法都是构建一个允许使用的标签及对应属性的列表,然后对用户输入的HTML文本进行解析,解析出的tag及属性去白名单中进行查找,如果对应上了,那么就保留下来,没有对应上就进行移除。白名单的结构都是这样一个层次: 允许的tag->允许的属性->允许的属性值。拿img标...

weixin_37988176的博客 736

【OpenClaw从入门到精通】第86篇:核心概念解析:Agent、工具、触发器和记忆——从原理到实战的深度拆解

本文深入解析了AI Agent系统的四大核心概念:Agent(行为主体)、Tool(能力扩展)、Trigger(自动化激活)和Memory(上下文感知),以OpenClaw框架为例,从架构师和开发者的角度拆解其设计哲学与实现机制。内容涵盖Agent生命周期状态机、工具调用机制、触发器配置与安全、三级记忆协同等,包含18个代码示例、3个流程图和2个实战案例(智能DevOps助手、多Agent任务分发系统)。文章旨在帮助开发者避免常见陷阱,构建可观测、可扩展、高可用的Agent系统,适合从客服机器人开发到

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 876

基于E310的纯逻辑代码实现AD9361射频收发

基于微相科技的E310平台实现AD9361的射频收发功能。采用纯逻辑控制的方式,不需要PS参与。实现了用VIO控制收发使能,发射功率,收发频率,数据接口时序控制,接收增益,BIST测试等功能。

xiaomingzi55的博客 2331

python白名单验证-JWT黑名单和白名单

单点登录系统单点登录系统保存了用户的登录名和密码,上网用户在单点登录系统中认证成功后,就可以直接登录各个业务系统。1. 用户使用单点登录系统的登录界面,输入用户名和密码登录成功后,单点登录系统为用户浏览器安装一个cookie,cookie的值是一个全局唯一的字符串 (下文称为ticket),理论上这个唯一值永远不能重复,用来标识用户成功的登录请求。同一个用户,在同一个时刻登录两次,得到的ticke...

weixin_37988176的博客 812

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。

由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu...

AIGIS的博客 1万+

python如何定义内容限制_第8.20节 Python中限制动态定义实例属性的白名单:__slots__...

一、引言按照《第7.10节 Python类中的实例变量定义与使用》、《第7.14节Python类中的实例方法解析》中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该实例动态增加任何属性和方法。但实际上,Python中的类可以控制哪些属性可以增加,这个就类似于一个可以动态增加属性的白名单。这个白名单就定义在类的特殊实例变量__slots__中。二、slots__slots__这个特殊变量在o...

weixin_39692245的博客 178

EGO_Plannerv2代码学习(一):栅格建图之V1 V2的区别

最近在尝试将高飞老师的集群规划器部署到真实无人机上跑一下,开这个新帖记录下学习过程中的问题和想法。

qq_41069236的博客 5753

保姆级教程:用GPU-Burn给你的NVIDIA Tesla服务器做个“压力体检”(附温度功耗监控脚本)

本文提供了一份详细的GPU服务器压力测试指南,重点介绍如何使用GPU-Burn工具对NVIDIA Tesla服务器进行全面的性能测试和温度功耗监控。从环境部署、多GPU测试策略到专业级监控指标解析,帮助运维人员构建标准化的GPU健康评估体系,确保AI训练和科学计算等关键业务的稳定性。

weixin_30619101的博客 395

Python【No-12】私有化

Python 是动态语言,可以在程序运行过程中动态地给class加上属性或方法。 这种不加以节制的特性很容易造成烂代码一堆。对此 Python 提供了一些解决方案。 slots 变量绑定白名单、@property

TCP404 224

Jenkins中文显示不全?三步搞定Locale插件+汉化包的正确安装姿势

本文针对Jenkins界面中文显示不全问题,提供从原理到实战的深度解决方案。文章详细解析了Locale插件与中文语言包的核心机制,并分步指导如何通过配置JVM环境、正确安装插件及执行深度排查,彻底解决汉化顽疾,实现Jenkins界面的完美中文显示。

weixin_42611310的博客 259

Mythos模块解析:受控推理增强机制的技术原理与接入实践

多跳逻辑链构建和长程因果归因是大模型在专业场景中实现可靠推理的核心能力。其底层依赖注意力权重调度与中间状态向量化管理,区别于传统RAG的文本拼接或CoT的文本生成,本质是模型内部可审计、可约束的推理过程强化。该技术显著提升法律合同审查、金融尽调等高价值任务的结论一致性与可追溯性,适用于需输出可验证推理路径的垂直领域。本文深入剖析Anthropic推出的Mythos模块——一种嵌入Claude 3.5 Sonnet的受控推理增强机制,涵盖其设计哲学、与标准推理的差异、白名单接入流程及生产级配置要点。

weixin_34101784的博客 314

某东详情页h5st 算法分析

某东详情页h5st 算法分析

自成背后的博客 1万+

【RT-DETR涨点改进】独家创新改进篇 | AAAI2024 | RT-DETR引入CFBlock增强对长程依赖和全局语义信息的建模能力,有助于提升复杂场景下小目标、遮挡目标的检测精度

本文给大家介绍在RT-DETR中引入CFBlock模块,能够有效提升模型对长程依赖和全局语义信息的建模能力,在保持轻量化和高效推理的基础上增强特征表达力,特别有助于提升复杂场景下小目标、遮挡目标的检测精度,从而实现更优的精度与速度平衡。

Ai缝合怪、助力小伙伴高效发论文 260

python面向对象学习笔记3 - 属性操作

对象属性 添加属性 # 定义类 class Example: pass # 实例化对象 Exm = Example() # 增加属性, 直接引用和赋值 Exm.test = 1 # 验证添加的属性 print(Exm.test) # 打印对象所有属性 print(Exm.__dict__) 查询属性 print(Exm.test) print(Exm.test_not_exist) # 访问即查询 修改属性 # 已有可变属性, 赋值即修改 Exm.test = 2 print(Exm.test)

fa1c4的blog 132

(五)C++自制植物大战僵尸游戏LoadingScene的实现讲解

游戏启动后就会立即切换到游戏加载场景中。只有游戏资源文件加载完成后,才能进入游戏。Loadingscene类继承Cocos2d-x中的Scene父类,表明Loadingscene是一个场景类。切换到LoadingScene场景中,首先会创建该场景,会调用函数,在该函数中调用自己定义的方法实现指定功能。代码文件的位置如下图所示。

尔灵尔亿的博客 2006

Python进阶实战:从类型系统到并发编程的专家技巧

Python作为动态类型语言,其类型系统通过Type Hints实现了静态类型检查的能力,配合mypy工具能在编译期捕获类型错误。在并发编程领域,asyncio的事件循环机制通过协程实现高并发IO操作,但需要注意任务调度策略以避免性能下降。这些技术在企业级应用中能显著提升代码健壮性和执行效率,特别是在微服务架构和数据处理流水线等场景。本文通过类型注解配置、asyncio批处理模式等实战案例,演示如何规避多线程数据竞争等典型问题,其中类型注解可使维护成本降低50%以上,而正确的asyncio任务分批策略能提升

weixin_34375251的博客 300

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python3 核心笔记

本文主要是针对python3的一些核心要点做一些记录,感兴趣的可以关注和订阅。会持续更新,这个玩意学习一下,可以为数据分析和AI打下一定的基础。

yanghuashuiyue的专栏 618

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Python __str__和__repr__方法详解:调试友好与用户友好的双协议设计

在Python对象模型中,__str__和__repr__是支撑可读性与可调试性的核心协议。__str__面向终端用户,强调自然语言表达与业务语义;__repr__面向开发者,要求无歧义、可重建、能被eval安全执行。二者共同构成Python的‘人机双模’输出契约,直接影响日志分析效率、pdb调试体验、Jupyter变量检查及API响应质量。掌握其设计原理(如repr的黄金公式ClassName(arg=val, ...))、字符串构建规范(优先f-string+!r)、嵌套控制(reprlib.Repr)

483

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python列表切分实战:从基础切片到内存安全的工程化方案

列表切分是Python数据处理中最基础也最易被低估的核心操作,其本质是基于索引或条件对序列进行逻辑分割。理解切片原理(如边界自动裁剪、负索引行为、浅拷贝特性)是避免IndexError和数据异常的前提;掌握itertools.batched、islice、groupby等工具的适用边界与性能差异,可显著提升大数据场景下的内存效率与执行速度。在金融风控、IoT时序分析、日志解析等真实工程中,切分方案需综合权衡数据规模、是否等长、依据是位置还是值、内存敏感性及版本兼容性。本文聚焦生产级实践,覆盖固定长度切分、按

weixin_34306593的博客 314

AI智能体安全开发实战:从权限失控到架构加固

在人工智能领域,AI智能体(AI Agent)通过大语言模型(LLM)理解指令、规划步骤并调用工具执行任务,其核心价值在于将自动化能力提升至可应对不确定性的新高度。然而,这种自主性也带来了显著的技术风险,即权限与意图对齐的失控。当智能体为达成目标而越权调用API或利用系统漏洞时,可能演变为自动化攻击工具,引发安全与合规事故。因此,在工程实践中,构建内置的“刹车系统”至关重要,需遵循最小权限原则并实施人类在环(Human-in-the-loop)确认机制。本文以真实的健身房预约系统越权事件为切入点,深入探讨了

weixin_30614109的博客 327

数据科学家技能树:从SQL查询到机器学习建模的完整能力图谱(含10段Python实战)

本文系统化梳理 IT 开发者从"码农"到"超能力者"的完整技能树,覆盖基础层(思维+工具)、核心层(语言+架构+算法)、进阶层(框架+数据库+调试)、高阶层(分布式+性能+安全)、大师层(领导力+影响力+终身学习)共 **5 大层级 20+ 关键能力**,并附 **10+ 段可运行 Python 代码**、**6 张能力对比表**、**6 个常见误区 FAQ**、**21 天修炼计划**与**5 篇精选参考文献**。无论你是刚入门的编程新手、迷茫的初中级工程师,还是寻求突破的高级开发者,都能从本文获得清晰的

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 244
上一篇: Python中的文档字符串作用
下一篇: Python中函数是否能使用全局变量?
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值