请教一个(*args, **kwargs)参数传递的问题

2017-08-21 21:49:18 +08:00
 saximi

class tracer(object):

    def __init__(self, func):   

            self.calls = 0   

            self.func = func 

    def __call__(self, *args, **kwargs):  

            self.calls += 1 

            print('call %s to %s' % (self.calls, self.func.__name__)) 

            return self.func(*args, **kwargs) 

    def __get__(self, instance, owner):   

            def wrapper(*args, **kwargs):  

                    print('wrapper:args=%s ,kwargs=%s'% (args,kwargs)) 

                    return self(instance, *args, **kwargs)   

            return wrapper 

class Person:

    def __init__(self, name, pay): 

            self.name = name 

            self.pay = pay 

    @tracer 

    def giveRaise(self, percent):  

            self.pay *= (1.0+percent) 

            print("pay=",self.pay) 

bob = Person('Bob Smith', 50000)

bob.giveRaise(.10)

上面代码的输出如下:

wrapper:args=(0.1,) ,kwargs={}

call 1 to giveRaise

pay= 55000.00000000001

我的问题是:wrapper 方法是在__get__方法内定义的,但是__get__方法并没有接收参数(*args, **kwargs),为何 wrapper 方法的(*args, **kwargs)参数会有值呢?

1676 次点击
所在节点    Python
1 条回复
Trim21
2017-08-21 22:11:54 +08:00
@tracer 相当于后面函数的装饰器了,你的 giveRaise 函数已经被 wrapper 替代了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/384685

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX