了解python装饰器。为什么这不起作用?

时间:2015-07-23 23:49:12

标签: python

我是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)

1 个答案:

答案 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