2022年5月21日 17:03 by wst
python高级今天在研究加密/解密算法的时候,看他们的源码,发现一个新的函数:types.MethodType()
据说它可以给实例动态添加方法,有点超出我的知识范围。因为给实例添加属性我是知道的,但是添加方法真是头一回听说,下面我们一探究竟:
这里定义了一个方法fn_get_grade,有个参数self。从函数体知道:self有个成员变量score. 然后对这个成员变量进行判断,得到分数对应的级别。
现在想一个问题:fn_get_grade这个函数能否添加到Person实例化的对象上呢?
import types
def fn_get_grade(self):
if self.score >= 80:
return 'A'
if self.score >= 60:
return 'B'
return 'C'
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
让我们继续往下看:
if __name__ == '__main__':
p1 = Person("Bob", 90)
p1.get_grade = types.MethodType(fn_get_grade, p1)
print(p1.get_grade())
运行上面的代码输出: A
说明p1实例获得了方法get_grade。
1.有人会问,为啥还要赋值呢?types.MethodType(fn_get_grade, p1) 这样不能直接给添加一个fn_get_grade方法吗?
2.用python的魔法函数可以吗?比如:setattr(p1, "get_grade", types.MethodType(fn_get_grade, p1))
答:1.不能;2.可以的
函数和方法的区别
函数是封装了一些独立的功能,可以直接调用,能将一些数据(参数)传递进去进行处理,然后返回一些数据(返回值),也可以没有返回值。可以直接在模块中进行定义使用。
方法和函数类似,同样封装了独立的功能,但是方法是只能依靠类或者对象来调用的,表示针对性的操作。