一、 引言
根据前面章节介绍的内容,我们知道实例变量、实例方法的定义可以通过以下方法进行:
- 在类体中直接定义实例变量、实例方法;
- 在实例方法中定义实例变量、实例方法;
- 在类体外调用方使用赋值语句赋值定义实例变量、实例方法;
- 给实例的__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 ...
随机推荐
-
HashMap
HashMap的定义 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, ...
-
Python学习笔记——函数
1.标准类型内建函数 <1>type() —— 返回对象的类型 <2>cmp() —— 比较两个对象,返回两个对象的ASCII码的差 <3>str().repr() ...
-
nginx demo
server_names_hash_bucket_size 512;upstream node_app { server 127.0.0.1:3000; } server { listen 80; s ...
-
(转载)APC支持php5.4了
(转载)http://www.neatstudio.com/archives/?article-2061.html 时隔一年多,APC终于又更新了,这次更新最大的就是支持PHP5.4:- Add PH ...
-
mysql慢查优化总结
1.优化sql语句结构 or改成union,使用start,limit 先只查询出所有的id,然后再排序.如果查询出所有的id仍然很慢,就要仔细考虑了. 2.添加索引 mysql每次查询只能使用一个索 ...
-
阿里云API网关(12)为员工创建子账号,实现分权管理API:使用RAM管理API
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
-
[JLOI2011]飞行路线
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
-
Window下通过CuteFTP与Linux虚拟机连接失败的原因总结及解决方法
环境:虚拟机类型Redhat Enterprise 6 (1) 虚拟机是否安装了ftp服务器? 若未安装,则yum install vsftpd,并启动ftp服务 (2) 虚拟机防火墙是否已关闭? 若 ...
-
Javascript 面向对象(共有方法,私有方法,特权方法,静态属性和方法,静态类)示例讲解
一,私有属性和方法 私有方法:私有方法本身是可以访问类内部的所有属性(即私有属性和公有属性),但是私有方法是不可以在类的外部被调用. <script> /* * 私有方法:私有方法本身是可 ...
-
TP5.1 钩子与行为应用
什么是行为: 可以将行为理解为是一个行为类的方法,在框架中行为类.行为方法则是有一定的规则约定:而钩子则是这些行为方法被调用执行的位置点.注意了,要想执行某个钩子中的行为,那行为一定要在应用程序执行到 ...