第8.28节 Python中使用__setattr__定义实例变量和实例方法

Python中使用__setattr__动态定义实例属性和方法 在这个示例中,我们创建了MyClass类的一个对象obj,并使用__setattr__方法动态定义了一个名为"my_new_attr"的实例属性和一个名为"my_new_method"的实例方法。__setattr__方法是一个特殊的方法,用于在设置对象属性时调用。通过重载__setattr__和__getattr__方法,我们可以实现自己的属性和方法操作方式,以满足我们的特定需求。上述代码定义了一个名为MyClass的类,该类重载了__setattr__、__getattr__和__dir__方法。 阅读详情

一、 引言
根据前面章节介绍的内容,我们知道实例变量、实例方法的定义可以通过以下方法进行:

  1. 在类体中直接定义实例变量、实例方法;
  2. 在实例方法中定义实例变量、实例方法;
  3. 在类体外调用方使用赋值语句赋值定义实例变量、实例方法;
  4. 给实例的__dict__字典中插入元素定义实例可以定义实例变量。
    其实还有一种方法,就是调用object类的__setattr__方法,也可以在实例方法或类体外定义实例变量、实例方法。
    二、 调用语法
  5. 调用语法:对象名.setattr( 实例属性名, 值);
  6. 语法释义:
    1)__setattr__方法是由obejct类实现的,各个没有实现该方法的自定义类自动继承,通过调用该方法可以给实例变量的属性赋值或定义一个新的实例属性(含实例变量和方法),本质上就是给实例所在的名字空间字典中添加或修改了一个“属性:值”对;
    2)“对象名”如果是在实例方法中就是“self”,在类体外就是对于实例的名字;
    3)该方法执行没有返回值,执行结果就是新增或者修改了一个“属性”。

三、 案例

  1. 案例说明
    1)定义了函数fdrive,准备用于实例方法定义使用;
    2)定义Car类, 其构造方法中定义了power实例变量和 totaldistance实例变量,不过totaldistance是使用__setattr__方法定义的;
    3)类定义后定义了类的实例car,查看实例的__dict__属性,可见实例属性中可以看到实例变量power和totaldistance;
    4)在类体外使用__setattr__方法将函数绑定到car的实例方法driver。

  2. 源代码

>>> def fdrive(self,distance):self.totaldistance += distance  #定义一个函数,准备用于赋值给类的实例方法属性

>>> class Car():
    def __init__(self, power):
        self.power = power
        self.__setattr__('totaldistance',0)
        
>>> car = Car('汽油发动机')
>>> car.__dict__ #查看自定义实例变量
{'power': '汽油发动机', 'totaldistance': 0}
>>> car.__setattr__('drive',fdrive)  #定义实例方法drive
>>> car.__dict__  #查看自定义实例变量
{'power': '汽油发动机', 'totaldistance': 0, 'drive': <function fdrive at 0x0000000003810730>}
>>> car.drive(103) #调用实例方法,由于没有绑定self,因此这样调用报错
Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    car.drive(103) #调用实例方法,由于没有绑定self,因此这样调用报错
TypeError: fdrive() missing 1 required positional argument: 'distance'
>>> car.drive(car,103) #调用实例方法drive
>>> car.__dict__  #查看自定义实例变量,可以看到totaldistance值修改了
{'power': '汽油发动机', 'totaldistance': 103, 'drive': <function fdrive at 0x0000000003810730>}
>>>

  1. 执行截图
    在这里插入图片描述
  2. 案例总结
    从上述案例可以看出,__setattr__方法可以定义实例变量和实例方法,与引言中介绍的几种方法效果一样。

本节结合案例介绍了使用__setattr__方法定义实例变量和实例方法的过程,其本质是与《第8.12节 Python类中使用__dict__定义实例变量和方法》一样的。
老猿Python,跟老猿学Python!
博客地址:https://blog.youkuaiyun.com/LaoYuanPython

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

Python中使用__setattr__定义实例变量和实例方法 方法是一个非常有用的特殊方法,它允许我们在Python中定义实例变量和实例方法时执行自定义操作。我们可以利用这个方法来拦截属性设置操作,并在需要时执行一些额外的逻辑。方法,我们可以在属性设置时执行自定义的逻辑,比如验证属性值的有效性、记录属性设置的日志等。方法,我们可以在实例属性设置时动态创建实例方法,这为我们实现一些高级的编程技巧提供了便利。这样,每当我们给实例设置属性时,都会先打印一条消息,然后再设置属性。方法的实现中,我们首先打印出正在设置的属性名和属性值,然后调用。的函数,并将其设置为实例的属性。 阅读详情

相关推荐

重写 Python 的 __setattr__ 方法实现属性修改捕获

当我们为一个类定义了属性后,我们可以通过直接赋值的方式修改属性的值。然而,有时我们希望在属性被修改时执行一些特定的操作,例如验证新值的有效性或记录属性的修改历史。方法是 Python 中的一个特殊方法,用于设置属性的值。例如,我们可以在方法中添加条件语句,根据属性名或新值的特定条件来执行不同的操作。这为我们在属性被修改时执行额外的操作提供了一种灵活的方式,可以根据具体的需求进行定制。方法来设置属性的值,我们重写该方法后需要手动调用父类的方法来完成赋值。方法,我们可以在属性被修改时执行自定义的逻辑。

code88888的博客 228

python __setattr__

1.__dict__是一个{}用来存储实例化对象的属性和方法 class Person: def __init__(self): self.name = "Liu" print(self.__dict__) person = Person() 当初始化name属性时,会将属性赋值给__dict__ 1.__setattr__()是在属性赋值时被访问,比如我们调用instance.x=1时,并将x存储到__dict__中 class Person(object):

Claroja 3002

Dual-stream multiple instance learning networks for tumor detection in Whole Slide Image——论文笔记

关于多示例学习的资料网上比较少,但是在医学图像方面还是有人在应用的。主要是因为一般比较大,几个G都是十分常见的,这么大图片是无法直接训练,一般都会进行切图,所以天然契合多示例学习bag和instance的概念。最近看了一篇论文刚好关于这方面的,所以做下笔记。 github地址:https://github.com/binli123/dsmil-wsi paper:https://arxiv.org/abs/2011.08939 背景知识 在多示例学习(MIL)中,一组训练样本被视为包含多个instance的

weixin_41693877的博客 4170

Python:setattr()函数和__setattr__()魔术方法

setattr()是一个python内置的函数,用于设置一个对象的属性值,一般情况下,可以通过点运算符(.)完成相同的功能,但是getattr()拥有一个点运算符无法实现的功能,就是允许使用字符串(甚至字符串内容可以不是一个标识符)来表示属性名,从而可以在运行时动态地选择要设置的属性,这对于编写通用的代码或者处理动态数据结构很有用。

保持终身学习的能力,温故而知新 1253

ThingsBoard 仪表板状态

请先通过阅读仪表板概述和仪表板入门案例来熟悉ThingsBoard的仪表板。文章希望通过浅显的文字描述什么是仪表板状态及如何使用。 概念 状态功能使得仪表板可以分层,配合小部件的动作,实现多层仪表板之间的跳转.每个状态对应一个仪表板的图层 每个仪表板有一个默认的根状态, 根状态可以理解为默认状态, 也就是打开仪表板默认展示的仪表板图层.编辑模式下, 点击右上角的图标来管理状态.添加多个状态后左上角出现状态切换(图层切换)下拉列表可以通过选中根状态复选框切换新的默认展示的状态/图层配合小部件的动作,实现状

物联网三分钟 2308

CXL Virtual Hierarchy (VH) Enumeration理解

在 CXL 3.0 协议中,CXL Virtual Hierarchy (VH) Enumeration 是一种针对 CXL 虚拟层级(Virtual Hierarchy) 设计的设备枚举机制,它允许软件将物理连接的 CXL 设备抽象为多个逻辑层级(虚拟层级),从而实现更灵活的资源管理和拓扑扩展。与传统的 PCIe 枚举相比,CXL VH 枚举在协议特性、拓扑抽象和资源分配机制上有显著差异。本质:VH 是一个逻辑上的设备层级结构,可能与物理连接拓扑不同。

Summer的博客 1001

第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定

一、 引言 在《第7.14节Python类中的实例方法解析》介绍了使用“实例对象名.方法名 = MethodType(函数, 对象)”将动态定义的方法与实例进行绑定 在《第8.12节 Python类中使用__dict__定义实例变量和方法》介绍了使用 self.__dict__['drive'] = MethodType(fdrive,self) 将动态定义的方法与实例进行绑定 这些绑定了方法...

老猿Python 1712

别再乱拖了!Godot 4.x 场景编辑器的7个隐藏操作技巧(附快捷键清单)

本文揭示了Godot 4.x场景编辑器的7个隐藏操作技巧,包括智能对齐、轴心点应用、多节点批量操作等,帮助开发者提升游戏开发效率。特别介绍了坐标系切换和自定义快捷键等实用功能,适用于处理复杂场景和团队协作。

weixin_29534421的博客 361

第8.30节 重写Python __setattr__方法实现属性修改捕获

一、 引言 在《第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获》章节介绍了__getattribute__方法,可以通过重写该方法,截获所有通过“实例名.属性名”访问实例变量、类变量、实例方法的所有操作,这是一个非常符合Python风格的方法。类似的,Python提供了__setattr__方法截获所有给属性赋值的能操作,在本节的前2节介绍了调用__s...

老猿Python 3576

告别反复刷写:用英飞凌XCP Overlay功能实现ECU标定与诊断的‘热更新’

本文详细介绍了英飞凌XCP Overlay功能在ECU标定与诊断中的应用,实现参数的'热更新',避免反复刷写Flash。通过地址重映射技术,将标定变量从Flash重定向到RAM,显著提升工作效率并保护Flash寿命。文章涵盖技术原理、工程实践、功能安全考量及高级应用场景,为汽车电子工程师提供完整解决方案。

weixin_30689307的博客 524

深入解析TMC2209 UART寄存器配置:从基础指令到高级参数调优

本文深入解析TMC2209 UART寄存器配置,从基础指令到高级参数调优,涵盖电流控制、微步细分等关键设置。通过实战案例和优化技巧,帮助开发者高效配置步进电机驱动,提升系统性能和稳定性。特别介绍了UART通信协议和CRC校验实现,确保数据传输可靠性。

tequila的博客 1159

python setattr 代码可读性_第8.30节 重写Python __setattr__方法实现属性修改捕获

一、引言在《第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获》章节介绍了__getattribute__方法,可以通过重写该方法,截获所有通过“实例名.属性名”访问实例变量、类变量、实例方法的所有操作,这是一个非常符合Python风格的方法。类似的,Python提供了__setattr__方法截获所有给属性赋值的能操作,在本节的前2节介绍了调用__set...

weixin_39578516的博客 252

保姆级教程:手把手教你用Python+Zemax仿真一个简易的Nd:YAG固体激光器谐振腔

本文提供了一份详细的Python与Zemax结合的Nd:YAG固体激光器谐振腔仿真教程。从基础理论到实战操作,涵盖晶体参数化、谐振腔设计、泵浦建模、动态仿真及热效应补偿等关键步骤,适合光学专业学生和工程师快速掌握激光器仿真技术。

weixin_30500473的博客 742

python中object基类的setattr(self, name, value, /)实例方法

Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ ) class Test: def __init__(self): self.count = 0 def __setattr__(self, name, value): print('__setattr__') self.count += 1 obj = Test() python3.8执行输

HayPinF的博客 2654

Redis下载安装与配置(windows)

一、Redis下载 二、Redis安装 三、启动Redis临时服务并测试连接(可跳过) 四、Redis配置

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 7万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

第8章 Python类中常用的特殊变量和方法目录

第8章 8.1节 Python类中常用的特殊变量和方法 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执...

老猿Python 1557

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python的hasattr() getattr() setattr() 函数使用方法详解

hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。 需要注意的是name要用括号括起来 1 >>> class test(): 2 ... name="xiaohua" 3 ... def run(self): 4 ... ...

bocai_xiaodaidai的博客 4641

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python中hasattr、getattr和setattr的使用方法

hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。需要注意的是name要用括号括起来 1 >>> class test(): 2 ... name="xiaohua" 3 ... def run(self): 4 .....

164

【python】getattr 和 setattr的用法,以及通过它们来动态的定义pytorch模块

net_depth=1 #单层cross attention中执行的次数):# 左右对称的两个attentionself.net_depth = net_depth # 保存 net_depth 为类属性])])

rocking_struggling的博客 733

python:魔法方法之__setattr__()

python魔法方法之__setattr__() 机器学习入坑者 机器学习入坑者 专注人工智能领域研究 ​关注他 16 人赞同了该文章 python提供了诸多的魔法方法,其中__setattr__()方法主要用于类实例进行属性赋值,其定义在Object类【1】中,官方提供的说明如下: Called when an attribute assignment is attempted. This is called instead of the normal mechanism (i.e. store the

flying_ant2018的博客 2177

python 内置属性__setattr___python魔法方法之__setattr__()

python提供了诸多的魔法方法,其中__setattr__()方法主要用于类实例进行属性赋值,其定义在Object类【1】中,官方提供的说明如下:Called when an attribute assignment is attempted.This is called instead of the normal mechanism (i.e. store the value in the i...

weixin_39703551的博客 394

使用__setattr__()方法魔改python

setattr()在属性赋值时被调用,并且将值存储在实例字典中,这个字典应该是self的__dict__属性。即:在类实例的每个属性进行赋值时,都会首先调用哦__setattr__()方法,并在__setattr__()方法中将属性名和属性值添加到类实例的__dict__属性中。 1、实例属性管理__dict__ 下面的测试代码中定义了三个实例属性,每个实例属性注册后都print()此时的__dict__ class AnotherFun: def __init__(self): s

小姑仔的博客 1377

Python-VBA函数之旅-setattr函数

setattr函数

ygb_1024的博客 1886

python的getattr和setattr

getattr可以取出来某个属性,这个属性如果是一个字段,就得到字段的值了,如果是一个方法,就得到这个方法的指针了,然后可以根据方法的指针来调用方法。下面是代码的例子: # -*- coding: utf-8 -*- class AttrTest(object): def __init__(self): self.__info = "AttrTest:"

zhang的专栏 4560

【Python】getattr和setattr的源码分析及使用

前言 鄙人有次在使用SQLALchemy的时候,对查询出来的对象,进行获取/重新赋值产生了点小问题 下面来一起看看这个小问题: from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.dialects.mysql import TI...

nioii-七仔 942
上一篇: 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
下一篇: 第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值