python 装饰器(八):装饰器基础(四)types.MethodType的作用
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,对应的功能或者样式就变了。
本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/12985889.html