我在写一个正确的装饰师吗?

时间:2014-03-26 16:47:30

标签: python magic-methods

最近我在学习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

关于它的两个问题:

  1. 装饰者是正确的吗?结果,看起来很好。但我不确定我在这里使用的魔术方法。
  2. 请注意print func中的__init__。为什么func这里只是一个function,但boundunbound都不是?为什么self.func(self.wrapped, *args, **kwargs)可以通过手动传递self作为第一个参数? (方法只是函数实例的简单组合作为第一个参数吗?)

0 个答案:

没有答案