gpt4 book ai didi

python - 如何使用一个类方法来修饰其他类方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:38:33 24 4
gpt4 key购买 nike

在设计类时,我发现类方法中,每次调用类方法时都会调用重复的步骤。例如:

class Queue(object):
def __init__(self):
self.connection = Connection()

def create(self, name):
self.probe = self.connection.plug()
self.probe.create(name)
self.probe.unplug()

def delete(self, name):
self.probe = self.connection.plug()
self.probe.delete(name)
self.probe.unplug()

并且有许多方法需要类似的步骤来“插入”和“拔出”“探针”。在此设计中,每次执行操作时,我们都需要“插入”和“拔出”“探针”。

因此,我正在考虑通过装饰器包装这些函数,以使代码看起来更少重复。

class Queue(object):
def __init__(self):
self.connection = Connection()

def _with_plug(self, fn):
def wrapper(*args, **kwargs):
self.probe = self.connection.plug()
fn(*args, **kwargs)
self.probe.unplug()

@_with_plug
def create(self, name):
self.probe.create(name)

@_with_plug
def delete(self, name):
self.probe.delete(name)

但这个策略并不奏效。如何使用类中的方法来装饰其他方法,以便在调用方法之前和之后执行此类操作?

最佳答案

对我来说似乎有些困惑的论点:

文件 deco.py,例如

def _with_plug(fn): # decorator takes exactly one argument, the function to wrap
print("wrapping", fn.__name__)
def wrapper(self, *args, **kwds):
print("wrapper called")
self.probe = [self.connection, ".plug()"]
fn(self, *args, **kwds)
self.probe.append(".unplug()")
return wrapper # decorator must return the wrapped function


class Queue(object):
def __init__(self):
self.connection = "Connection()"

@_with_plug
def create(self, name):
self.probe.append("create(name)")

@_with_plug
def delete(self, name):
self.probe.append("delete(name)")

检查:

>>> import deco
wrapping create
wrapping delete
>>> q = deco.Queue()
>>> q.create("name")
wrapper called
>>> q.probe
['Connection()', '.plug()', 'create(name)', '.unplug()']

观察装饰器函数是在要包装函数的定义时调用的,即在类定义完成之前以及创建第一个实例之前很久。因此,您无法按照您尝试的方式引用 self

关于python - 如何使用一个类方法来修饰其他类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42336328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com