Discuss / Python / 绑定实例属性时为什么需要这两行?

绑定实例属性时为什么需要这两行?

Topic source

YY饺子

#1 Created at ... [Delete] [Delete and Lock User]

def set_age(self, age): # 定义一个函数作为实例方法 ... self.age = age ...

from types import MethodType s.set_age = MethodType(set_age, s) # 给实例绑定一个方法 s.set_age(25) # 调用实例方法 s.age # 测试结果 25

from types import MethodType

s.set_age = MethodType(set_age, s) # 给实例绑定一个方法

为什么需要上面这两行,把这两行去掉,直接调用S.set age不行吗?

MethodType模块的作用是将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

Reply