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,对应的功能或者样式就变了。



posted @ 2020-05-29 10:16  秋华  阅读(1431)  评论(0编辑  收藏  举报