第8.28节 Python中使用__setattr__定义实例变量和实例方法
一、 引言
根据前面章节介绍的内容,我们知道实例变量、实例方法的定义可以通过以下方法进行:
- 在类体中直接定义实例变量、实例方法;
- 在实例方法中定义实例变量、实例方法;
- 在类体外调用方使用赋值语句赋值定义实例变量、实例方法;
- 给实例的__dict__字典中插入元素定义实例可以定义实例变量。
其实还有一种方法,就是调用object类的__setattr__方法,也可以在实例方法或类体外定义实例变量、实例方法。
二、 调用语法 - 调用语法:对象名.setattr( 实例属性名, 值);
- 语法释义:
1)__setattr__方法是由obejct类实现的,各个没有实现该方法的自定义类自动继承,通过调用该方法可以给实例变量的属性赋值或定义一个新的实例属性(含实例变量和方法),本质上就是给实例所在的名字空间字典中添加或修改了一个“属性:值”对;
2)“对象名”如果是在实例方法中就是“self”,在类体外就是对于实例的名字;
3)该方法执行没有返回值,执行结果就是新增或者修改了一个“属性”。
三、 案例
案例说明
1)定义了函数fdrive,准备用于实例方法定义使用;
2)定义Car类, 其构造方法中定义了power实例变量和 totaldistance实例变量,不过totaldistance是使用__setattr__方法定义的;
3)类定义后定义了类的实例car,查看实例的__dict__属性,可见实例属性中可以看到实例变量power和totaldistance;
4)在类体外使用__setattr__方法将函数绑定到car的实例方法driver。源代码
>>> 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>}
>>>
- 执行截图

- 案例总结
从上述案例可以看出,__setattr__方法可以定义实例变量和实例方法,与引言中介绍的几种方法效果一样。
本节结合案例介绍了使用__setattr__方法定义实例变量和实例方法的过程,其本质是与《第8.12节 Python类中使用__dict__定义实例变量和方法》一样的。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
第8.28节 Python中使用__setattr__定义实例变量和实例方法的更多相关文章
- 第8.20节 Python中限制动态定义实例属性的白名单:__slots__
一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- python中的类变量、实例变量
类变量,是各个实例共享的资源,就像中央空调,只有一个,但每个房间(实例)均可享用. 实例变量,是每个实例各自分配使用的变量,每个房间(实例)都有一台空调,供自己使用. class handle(obj ...
- 第7.22节 Python中使用super调用父类的方法
第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...
- 第7.4节 Python中与众不同的类
一. 引言 在较旧的Python版本中,类型和类之间泾渭分明:内置对象是基于类型的,而自定义对象是基于类的.因此,你可以创建类,但不能创建类型.在较新的Python 2版本中,这种差别不那么明显 ...
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
- 第7.15节 Python中classmethod定义的类方法详解
第7.15节 Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一. 类方法的定义 在类中定 ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...
随机推荐
- ant-design-vue 快速避坑指南
ant-design-vue是蚂蚁金服 Ant Design 官方唯一推荐的Vue版UI组件库,它其实是Ant Design的Vue实现,组件的风格与Ant Design保持同步,组件的html结构和 ...
- Linux C 获取本机所有网卡的 IP,Mask
0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 代码 #include <sys/ioctl.h> ...
- 【Java】线程的创建方式
1.继承Thread类方式 这种方式适用于执行特定任务,并且需要获取处理后的数据的场景. 举例:一个用于累加数组内数据的和的线程. public class AdditionThread extend ...
- Git操作:远程仓库(git remote)的添加、管理和删除
这是你的git仓库,他已经添加了一个远程仓库,可以用git remote -v查看绑定的仓库列表,他会以<仓库名> <仓库地址>的形式展示出来(一个仓库会显示两遍): $ g ...
- 采用“传统”方式获取当前HttpContext
我们知道"依赖注入"已经成为了.NET Core的基本编程模式,表示当前请求上下文的HttpContext可以通过注入的IHttpContextAccessor服务来提取.有时候我 ...
- TCP Persist 坚持定时器
1.坚持定时器在接收方通告接收窗口为0,阻止发送端继续发送数据时设定. 由于连接接收端的发送窗口通告不可靠(只有数据才会确认),如果一个确认丢失了,双方就有可能因为等待对方而使连接终止: 接收放等待接 ...
- tcp syn-synack-ack 服务端接收ack
TCP 服务端 接收到ack tcp_v4_rcv() -> tcp_v4_do_rcv() -> tcp_v4_hnd_req() + tcp_child_process()tcp_v4 ...
- libcurl 使用记录
1.libcurl中 CURLOPT_TIMEOUT 是使用 SIGALRM实现的,所以要注意 其对别的 SIGALRM 的使用的影响.
- 剑指offer刷题(Tree)
开篇 二刷剑指offer了,本来用Tyora记的笔记,发现字数到四万了就变得好卡o(╥﹏╥)o,刚好开始写博客,就转过来吧,记下来子自己看.不废话,开刷... JZ26. 树的子结构 输入两棵二叉树A ...
- grep/字符/次数匹配/锚定符/小大括号/wc/tr/cut/sort/uniq
grep:正则表达式,文本过滤工具,能够实现以指定的"模式(Pattern)"逐行搜索文件中的内容,并将匹配到的行显示出来. 模式:是由正则表达式的元字符,其他字符组合起来的匹配字 ...