class test :
def fn(self, i):
#test.fn.f = 0 the "compiler" show "not define" errors
#self.fn.f = 0 the "compiler" show "not define" errors
return test.fn.f #ok
return self.fn.f #ok
fn.f = 1
p = test()
print p.fn(1)
我只是好奇为什么我不能在“fn”方法
中更改属性的值从本质上讲,它是......
test.fn.f
和self.fn.f
之间有什么区别?我确定可以修改函数的属性值,但为什么我可以在方法中做到这一点?
答案 0 :(得分:4)
以下是:
fn.f = 1
为函数本身提供了一个属性。
但是在使用test.fn
和self.fn
进行访问时,您不会获得该功能,而是instancemethod
。为什么?因为在类中的属性访问时,如果有任何组件的__get__
方法被调用。在函数的情况下,就是这种情况。
如果调用函数的__get__
方法,则将其转换为绑定或未绑定的实例方法,该方法只是函数的包装器。
你可以用
解决这个问题test.fn.im_func.f = 1
self.fn.im_func.f = 1
答案 1 :(得分:1)
您无法将任意属性分配给instancemethod
。赋值在类体内工作,因为它在那时仍然是function
;在块结束时创建类之前,它不会成为instancemethod
。