gpt4 book ai didi

设置类变量的Python装饰器

转载 作者:太空宇宙 更新时间:2023-11-03 12:42:22 25 4
gpt4 key购买 nike

我有一段代码可以获取 FooBar 中所有函数的列表以及该函数在其参数消息上支持的正则表达式:

functionList = []

def notify(RegExpression):
def _notify(function):
functionList.append((RegExpression, function))

return function

return _notify

class FooBar:
@notify(".*")
def everything(self, message):
pass

@notify("(\w+):.*")
def reply(self, message):
pass

for foo in functionList:
print("%s => %s" % foo)

我想做类似的事情,但将函数列表及其参数作为类变量放入类中。当存在更多类似 FooBar 的类时,它可以防止出现问题。每个类都应该有自己的列表。

def notify(RegExpression):
# ???

class FooBar:
functionList = []

@notify(".*")
def everything(self, message):
pass

@notify("(\w+):.*")
def reply(self, message):
pass

for foo in FooBar.functionList:
print("%s => %s" % foo)

什么放入notify()

最佳答案

直接用函数装饰器做这个是不可能的,因为你需要访问当前正在定义的类,而这个类还不存在。一种解决方案是使装饰器仅将正则表达式存储为方法的属性,并具有在基类上收集这些方法的功能:

def notify(regex):
def decorate(func):
func.regex = regex
return func
return decorate

class Baz(object):
@property
def function_list(self):
for attr in dir(self):
obj = getattr(self, attr)
if callable(obj) and hasattr(obj, "regex"):
yield obj

class FooBar(Baz):
@notify(".*")
def everything(self, message):
pass

@notify("(\w+):.*")
def reply(self, message):
pass

for foo in FooBar().function_list:
print("%s => %s" % (foo.regex, foo))

关于设置类变量的Python装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5343001/

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