gpt4 book ai didi

python - 是否可以在 python (2.4) 中制作这种装饰器?

转载 作者:行者123 更新时间:2023-12-01 06:01:34 25 4
gpt4 key购买 nike

我有类(class)窗口。这个类有 onClick 方法,它获取参数,即在该窗口上单击的控件的 id(我无法更改它的工作方式):

 class Window(SoneBaseWindowClass):

def onClick(self,controlID):
print controlID

我想制作一个装饰器,它将我的方法添加到回调堆栈中。当点击某个控件时,onClick 方法会调用特定的方法。所以:

class Window(SoneBaseWindowClass):
def __init__(self):
callback_stack = {}

def onClick(self,controlId):
callback = self.callback_stack.get(controlID)
if callback is not None:
callback()

# suppose to add decorated method to a callback_stack
def onclick_decorator(method):
pass

所以我需要制作一个装饰器,它将向callback_stack添加一些方法。使用示例。

class MyWindow(Window):

@onclick_decorator(12345)
def someMethod(self):
print "Gets called when control with id 12345 clicked"

实际上问题是我如何从onclick_decorator访问类Self 不会传递给该方法。所以我可以假设它可以访问类,但不知道如何访问。

最佳答案

处理这种情况的方法是让装饰器将装饰方法添加到数据结构(在您的情况下为 CallbackStack) - 但是要将该数据结构附加到类,当类被创建(即解析) - 因为在解析它时,正如您所说,装饰器无法访问实例或类。

在现代Python(甚至Python 2)中,有两种方法可以做到这一点:您可以使用metclass或类装饰器。但我认为类装饰器可用于 Python 2.4 - 因此您需要有一个元类。

事情并没有那么复杂——元类上的__new__方法会传递解析过程中构造的字典。您的装饰器所要做的就是使用元类可以找到的属性来标记所需的方法 - 并根据这些标记构建您的callback_stack。 call_back 堆栈甚至可以是字典:

def on_click_decorator(key):
def real_decorator(func):
setattr(func, "_callback_to", key)
return func
return real_decorator


class Meta(type):
def __new__(metacls, name, bases, dct):
callback_stack = {}
for name, value in dct.items():
if hasattr(value, "_callback_to"):
callback_stack[value._callback_to] = key
dct["callback_stack"] = callback_stack
# we've done all needed manipulation - no
# need for the class to be from a special type - so we
# don't call type.__new__
return type(name, bases, dct)

现在您可以从方法内部调用self.callback_stack[controlID] 检索注册的函数(您可以使用上面的代码将它们作为函数而不是方法获取,所以通过明确地向他们“ self ”)。

关于python - 是否可以在 python (2.4) 中制作这种装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10143538/

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