gpt4 book ai didi

python - 将类变量传递给装饰器

转载 作者:行者123 更新时间:2023-11-28 17:29:35 25 4
gpt4 key购买 nike

我有这样一个类

class BusinessLogic(object):
def __init__(self):
self.url_context = None
self.attribute_info = None
self.current_data = None

def __nonzero__(self):
if self.url_context and self.current_data:
return True
return False

def clean_up(self):
self.url_context = None
self.current_data = None

def set_current_info(self, url_context, data):
self.url_context = url_context
self.current_data = sku_data

def handle_secondary_id(self):
try:
orig_data = copy.deep_copy(self.current_data)
keep_secondary_id = self.url_context.layout.get('Secondary_Id', False)
if not keep_secondary_id and ATTRIBUTE_SECONDARY_ID in self.current_data.attributes:
del self.current_data.attributes[ATTRIBUTE_SECONDARY_ID]
except Exception, e:
print "Error!!!"
self.current_data = orig_data

def process_sku(self):
if self:
self.handle_secondary_id()
# Can have multiple functions below
#self.handle_other_attributes()
return self.current_sku_data

基本上在我的 handle_secondary_id 函数中,我在 orig_data 中对我的 current_data 进行了深度复制,执行一些操作,如果操作失败中间比我将 orig_data 复制到 current_data。我必须在 handle_other_attributes 等其他函数中执行类似的操作。

所以想法是对self.current_data 执行一系列操作并保存中间结果,以防任何一个操作失败将之前保存的状态复制到current_data 并继续。但我想避免编写 try: except: block。我正在考虑通过将 BussinessLogic 对象传递给装饰器来为它编写一个装饰器,但我不确定该怎么做

最佳答案

self 只是发送到方法的参数。您可以在装饰器包装器函数中捕获它,如下所示:

def MyDecorator(f):
def wrapper(*args):
print args[0].x
return f(*args)
return wrapper

class C(object):
def __init__(self):
self.x = 1
@MyDecorator
def do(self):
print 'do'

c = C()
c.do()

产量

1
do

关于python - 将类变量传递给装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35432037/

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