Python学习笔记——动态添加属性与方法
来源:互联网 发布:王者荣耀显示网络异常 编辑:程序博客网 时间:2024/05/16 19:39
我们都知道Python是动态语言。
动态?动态在哪里呢?
假如C语言定义了一个类,我们在类固定的情况下,可以不可以为这个类或者这个类的对象添加对象呢?答案肯定是否定的
但是Python就可以。下面我们来看看。
一.动态添加属性
1.动态添加对象属性
我们来新建一个类。
我们建立了一个Person类,用Person类生成了一个对象
xiaoming有2个属性,一个属性是姓名,一个属性是年龄
这两个属性直接调用是没有问题的
动态在于 我们直接 xiaoming.addr = ‘北京市XXX’
然后我们调用xiaoming.addr 就有这个属性了,我们刚才没有动类的结构吧?这就是动态添加,在程序运行的时候我们就可以对 这个类生成的对象 进行扩充,当然这样绑定完后,addr属性是属于小明的。
xiaoguang是Person类生成的对象,然而小光并没有addr这个属性。
对象.新属性,生成的属性,是绑定在该对象身上的,在同类对象身上是无法使用的。
2.动态添加类属性
之前我们说过,有一种属性叫做类属性,此类生成的对象,自动继承非私有类属性。例如:
这是在构造类的时候,直接在类中写一个addr属性,我们可以利用属性调用这个属性,也可以像这样调用Person.addr。
我们用同样的方式为类动态添加属性试试~
这时候我有个疑问,按照一般逻辑,我们先为类添加属性,然后再用这个类生成对象,那么这个类的属性肯定就被对象继承了
那如果我先新建对象,然后在动态添加类属性呢?
先建立对象后动态添加类属性,对象竟然也自动继承了类属性。我一脸懵逼,这就是动态所在吧。
今天先到这里,后面还有动态添加方法。改天再写。
二.动态添加方法
1.动态添加实例方法
既然动态添加属性会了,那我们先试着用同样的方法添加方法。
看看清楚,run是类自己有的方法,我调用的时候只需要xxx.run()就可以了。
但是eat是我们动态添加的方法,需要传个参数,这个参数其实就是对象本身
(在类内的self本质上就是对象本身)
这样也是可以调用的,但是这不是我们想要的样子啊,我们想做到和run方法一样,直接调用就行
那我们应该怎么办呢?
这时候我们就要引入一个东西了。叫做types这个模块中有个方法叫做MethodTpye是专门用于动态添加方法的。
就这么简单,我们完成了动态添加方法。
那有人会问,为什么要用xiaoming.eat去接这个MethodTypes的返回值呢?
用别的接可不可以?
你别说用别的接了,就是不接直接在后面加()都可以出结果
我们来help一下看看
参数(方法名,对象名)
创造一个绑定实例对象的方法对象
这里可以明白之前的用法了吧。
MethodType帮助我们把被绑定的对象固化在了方法里,然后把这个方法的地址传了回来
我们用xiaoming.eat接收是为了更明白的表达小明拥有了eat方法,就像类结构中本来就有的run方法一样。
2.动态添加类方法
我们都知道类方法是被所有由此类生成的对象继承的。
我们利用刚才的原理也不难为类动态添加类方法。
3.总结
明白MethodType方法以及其返回值就好了。一定记得它返回的是地址,你要用对象.新建方法名,或者类.新建类方法名 去接返回值。还有就是记得导入types(我就总犯这个错误,滑稽脸)
- Python学习笔记——动态添加属性与方法
- python动态添加属性和方法
- Python动态语言-动态添加属性和方法
- iOS类添加方法、属性学习笔记
- Python高级教程之动态添加属性及方法
- Python学习笔记【九】——《python基础教程》:: 魔法方法、属性和迭代器
- python学习笔记(属性和方法)
- JavaScript可以动态添加、删除对象属性与方法
- Python学习笔记——类属性和实例属性
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
- python学习笔记——第九章 属性 方法和迭代器
- Python基础教程第九章学习笔记——魔法方法、属性和迭代器
- Objective-C学习笔记(二十五)——属性与方法的继承学习
- python学习——类属性与实例属性
- 流畅python学习笔记:第十九章:动态属性和特性
- python学习:实例动态绑定属性和方法
- 学习笔记——关于动态绑定和属性初始化
- Python中类的方法属性与方法属性的动态绑定
- tensorflow可视化tensorboard “No graph definition files were found.” 错误
- 全面理解Java内存模型
- 读论文《Efficient Estimation of Word Representations in Vector Space》
- Struts2 实现多文件上传
- 448. Find All Numbers Disappeared in an Array(java)
- Python学习笔记——动态添加属性与方法
- 对象说睡前要敲几行代码
- lua ...的使用
- 统计代码有效行数
- 省市联动的JSON格式数据
- 面试总结-成长之路
- 总结div水平居中的方法
- MapReduce实现寻找共同好友
- hdu 3999 The order of a Tree