使用修饰符的Python方法定义

2024-09-30 14:27:34 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能彻底解释一下以下代码的最后一行:

def myMethod(self):
    # do something

myMethod = transformMethod(myMethod)

为什么要通过另一个方法传递方法的定义?那又如何呢?提前谢谢!在


Tags: 方法代码self定义defdosomethingmymethod
3条回答

您描述的是一个decorator,一种方法/函数修改的形式,使用decorators的特殊语法可以更容易地完成。在

你所描述的相当于

@transformMethod
def myMethod(self):
    # do something

decorator的用法非常广泛,例如以@staticmethod@classmethod@functools.wraps()@contextlib.contextmanager等形式,等等

由于特定的Python版本(我认为是2.6),类也可以被修饰。在

这两种decorator都允许返回甚至不是函数或类的对象。例如,您可以用一种方式来修饰生成器函数,将其转换为dict、set或其他任何东西。在

^{pr2}$

我在这里做什么?在

我创建了一个函数,它接受一个“要应用的东西”,然后返回另一个函数。在

这个“内部”函数接受要修饰的函数,调用它并将其结果放入外部函数并返回此结果。在

f()返回生成器对象,然后将其放入dict()或{}。在

Why would you want to pass the definition for a method through another method?

因为你想修改它的行为。在

And how would that even work?

很好,因为函数在Python中是一流的。在

def decorator(f):
  def wrapper(*args, **kwargs):
    print 'Before!'
    res = f(*args, **kwargs)
    print 'After!'
    return res
  return wrapper

def somemethod():
  print 'During...'

somemethod = decorator(somemethod)

somemethod()

这是函数包装的一个例子,当你有一个函数接受一个函数作为参数,并返回一个新函数来修改原始函数的行为。在

下面是一个如何使用的示例,这是一个简单的包装器,它只在每次调用时打印“Enter”和“Exit”:

def wrapper(func):
    def wrapped():
        print 'Enter'
        result = func()
        print 'Exit'
        return result
    return wrapped

下面是一个如何使用的示例:

^{pr2}$

为了方便起见,Python提供了decorator syntax,它只是函数包装的一个速记版本,它在函数定义时执行相同的操作,下面是如何使用它:

>>> @wrapper
... def say_hello():
...     print 'Hello'
... 
>>> say_hello()
Enter
Hello
Exit

相关问题 更多 >