我是python的新手,正在摆弄东西。我真的不明白为什么这段代码不起作用。你能帮我理解这里发生了什么吗?
from functools import wraps
class A:
def __init__(self):
self.methodName = 'temp1'
def temp(self, i):
print(self.__class__.__name__)
print("hi" + str(i))
def temp2(self):
print("hey hey hey")
class B:
pass
class C:
def __call__(self, Func):
@wraps(Func)
def newFunc(*args, **kwargs):
return Func(*args, **kwargs)
return newFunc
if __name__ == '__main__':
a = A()
setattr(B, a.methodName, a.temp)
setattr(B, 'temp1', C().__call__(a.temp))
b = B()
b.temp1(5)
答案 0 :(得分:1)
试试这个:
from functools import wraps
class A :
def __init__(self):
self.methodName = 'temp1'
def temp(self, i) :
print (self.__class__.__name__)
print("hi" +str(i))
def temp2(self):
print "hey hey hey"
class B :
pass
class C :
def __call__(self,Func) :
@wraps(Func)
def newFunc(self, *args, **kwargs) :
return Func(*args, **kwargs);
return newFunc
if __name__ == '__main__' :
a = A()
setattr(B, a.methodName, a.temp)
setattr(B, 'temp1', C().__call__(a.temp))
b = B()
b.temp1(5)
请注意,newFunc
现在将self
作为其第一个参数。
这样做的原因是绑定实例方法(如b.temp1
)总是接收绑定实例作为第一个参数(在本例中为b
)。最初,您通过*args
将所有参数传递给a.temp
。这意味着使用参数temp
调用(a, b, 1)
。将self
添加到newFunc
的参数列表可确保a
不会错误地传递给temp
。