python 装饰器(八):装饰器基础(四)types.MethodType的作用
2024-09-02 05:36:24
1 types.MethodType的作用—添加实例方法
import types class cla(object):
def __init__(self, name, age):
self.name = name
self.age = age def prii(self):
print("pri") def f1(self):
print("f1") c = cla("zhangsan", 40) c.prii() c.f1=types.MethodType(f1,c) c.f1() xxx=types.MethodType(f1,c) xxx()
pri
f1
f1
↑可以看到,
xxx()
一样可以正常的执行。所以这个动态添加的办法和原生的属性还是有所区别的。执行了types.MethodType(f1,c)
之后,相当于产生了一个特殊返回值,这个返回值指向的f1
的函数代码,里面已经被默认传递了c对象作为参数,只要使用这个返回值,就可以当做是
调用了对象的方法。c.f1=types.MethodType(f1,c)
这么写之后,再调用c.f1()
,完全是为了字面上的符合,符合这个操作的原意而已。2 types.MethodType的作用—添加静态方法
在使用静态方法时,类中的self将不会再进行传值,此时,静态方法已经和类没什么关系了。
需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数。
import types class cla(object):
def __init__(self, name, age):
self.name = name
self.age = age def prii(self):
print("pri") def f1(self):
print("f1") #@符号,要想起装饰器!
@staticmethod
def test():
print(":static") c = cla("zhangsan", 40) #这里不也不是必须叫cla.test,随便都可以
cla.test=test
cla.test()
:static
↑这里不需要绑定,因为静态方法不需要任何的参数,只要赋值了就直接用。注意要使用类名来调用。
3 types.MethodType的作用—添加类方法
import types class cla(object):
def __init__(self, name, age):
self.name = name
self.age = age def prii(self):
print("pri") def f1(self):
print("f1") @staticmethod
def test():
print(":static") @classmethod
def clsm(cls):
print("classmethod call") c = cla("zhangsan", 40) cla.clsm=clsm cla.clsm()
classmethod call
↑类方法也是直接赋值调用就行。
动态添加可以做到什么呢?一款APP,在没有进行整个APP的情况下,里面的部分功能变了。即我部分的功能代码存在一个文件中,我在后台默默更换这些文件,下次你再打开APP,对应的功能或者样式就变了。
最新文章
- 《InsideUE4》-4-GamePlay架构(三)WorldContext,GameInstance,Engine
- PE530 : GCD of Divisors
- 20161025__Oracle10g双机备份
- 多屏判断css改写
- TigerLeapMC V1.3 for Windows(支持DLNA)
- QT线程(二)---线程同步
- Activity启动模式图文详解
- JS中的for和for in循环
- 让rdlc报表在ReportViewer中水平居中的方法
- oracle 集合变量以及自定义异常的用法
- HTML5分析实战WebSockets一个简短的引论
- Win7配置IIS7
- 关于ftp出现425错误
- 201621123057 《Java程序设计》第10周学习总结
- Mapjoin和Reducejoin案例
- 一种导致 emwin 中 EDIT 控件不显示的情况
- 多线程系列(3)任务Task
- PAT L2-010 排座位(floyd)
- 如何处理好前后端分离的 API 问题(转载自知乎)
- Linux 系统的文件类型