绑定实例属性时为什么需要这两行?
Topic sourceMethodType模块的作用是将set_age方法绑定到class Student()的内部, s.set_age = MethodType(set_age, s)的作用等同于 Student.set_sge = set_age 也可以这样写: s.set_age = MethodType(set_age,Student)。 如果直接写s.set_age = set_age 给实例绑定的“set_age”并不是我们上面的定义的set_age方法,或者说我们创建的set_age并没有绑定到class Student()的内部,这样当我们运行
s.set_age(25)时
会报错:TypeError: set_age() missing 1 required positional argument: 'age' 说明s.set_age(25)调用的并不是我们前面定义的set_age(self, age)方法。
@说大话的拖延症,大哥你别误导人啊,给某实例绑定方法,不影响其他实例,上面廖大都讲的清清楚楚。你说 “s.set_age = MethodType(set_age, s)的作用等同于Student.set_sge = set_age”
,真是大错特错,因为给实例绑定方法不影响类的方法。
回答一下为什么不能去掉那两行,去掉的话想正确调用函数的话要这样调用:set_age(S,value),也就是说S.set_age(value)会报错,而目的是给实例绑定方法,调用方法的格式是 实例.方法,但是现在变成了set_age(S,value),所以并没有给实例绑定方法。但是就给实例设定age而言,也可以去掉那两行,就给实例增加方法而言,不可以去掉那两行
看清楚,仔细理解一下: 绑定实例属性,是不是应该先有一个绑定的对象?而你说的这两句就是要绑定进去的对象啊。 如果没有对象,那你要绑定什么东西?这两句就是你要绑定的东西。 而后面 s.set_age = MethodType(set_age, s) 就是绑定的意思。
哎呀,看错了,不好意思。 绑定实例属性,需要用要MethodType()函数,而这个函数放在types模块中, 要使用MethodType()函数,必须先引入types模块, from types import MethodType # 这句的意思是,引入types模块中的MethodType()函数。 s.set_age = MethodType(set_age, s) # 这句就是绑定的意思了,必须使用MethodType()函数才能绑定。 这样说应该理解了一些了吧。
- 1
YY饺子
def set_age(self, age): # 定义一个函数作为实例方法 ... self.age = age ...
from types import MethodType
为什么需要上面这两行,把这两行去掉,直接调用S.set age不行吗?