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(我就总犯这个错误,滑稽脸)

阅读全文
0 0
原创粉丝点击