最近我在学习Python 中阅读有关装饰器的内容。通过跟随描述符作为装饰器的一个例子,我试着写一个不同版本的它。
class tracer3(object):
def __init__(self, func):
print func # what func should it be: bound, unbound, or function?
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(self.wrapped, *args, **kwargs)
def __get__(self, instance, owner):
self.wrapped = instance
return self
class Person:
@tracer3
def spam(self, say):
print 'Hello %s' % say
p = Person()
p.spam('world')
产生
<function spam at 0x10b0260c8> call 1 to spam Hello world
关于它的两个问题:
print func
中的__init__
。为什么func
这里只是一个function
,但bound
和unbound
都不是?为什么self.func(self.wrapped, *args, **kwargs)
可以通过手动传递self
作为第一个参数? (方法只是函数和实例的简单组合作为第一个参数吗?)