gpt4 book ai didi

python - 使用内省(introspection)来查找对象的方法,然后进行过滤

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

我的 Python 模块中有一个用于 frobs 小部件的类。它有多种方法可以做到这一点,但我事先不知道哪些方法(如果有的话)会真正起作用,并且我可能会在以后找到新的方法来获取小部件。此外,fbbing 小部件可能会很昂贵。因此,我希望我的类的一个实例能够查看自身,找到它用于 frobing widgets 的所有方法,并开始尝试 frob widgets 直到成功,此时它应该停止关心尚未尝试过的方法。

class WidgetFrobber:
def simpleFrobAttempt(widget, data):
# fastest way, might not work
def cleverFrobAttempt(widget, data):
# fiddly, fast, and doesn't always work
def boringFrobAttempt(widget, data):
# works most of the time, often slow
def desperateFrobAttempt(widget, data):
# doesn't always work, pathetically slow

有了这个,我想定义一个类的方法,它查找名为 ^[a-z]+FrobAttempt$ 的方法,创建它们的列表,并尝试 frob 小部件直到小部件成功被调用(此时它应该停止关心其他方法)或者它耗尽了可能的方法。由于这是我的代码,我可以确保 whateverFrobAttempt 方法都具有相同的命名约定和所需参数。最好对方法列表进行一些排序,以便首先尝试平均速度较高的方法,但如果以随机顺序尝试它们也是可以接受的。

有没有一种明智的方法可以做到这一点,这样当添加新的 weirdFrobAttempt 方法时,它们会自动尝试,或者我最好只维护此类方法的硬编码列表并迭代那?

最佳答案

我喜欢斯文关于拥有寄存器的想法。这是很hacky的,但是如果可以存储方法名称的全局列表,那么我们可以这样做:

FROB_METHOD_REGISTER = []
def frob_method(fn):
def decorate_frob(fn):
FROB_METHOD_REGISTER.add(fn.__name__)
return fn
return decorate_frob

class WidgetFrobber:
def get_frob_methods(self):
return [getattr(self, method) for method in FROB_METHOD_REGISTER]

@frob_method
def simpleFrobAttempt(widget, data):
# fastest way, might not work
@frob_method
def cleverFrobAttempt(widget, data):
# fiddly, fast, and doesn't always work
@frob_method
def boringFrobAttempt(widget, data):
# works most of the time, often slow
@frob_method
def desperateFrobAttempt(widget, data):
# doesn't always work, pathetically slow

那么你就可以这样做

for method in my_widget_frobber.get_frob_methods():
#do your thing

不确定这是否是最好的或最Pythonic的方式,如果有一些方法严格优于其他方法,我会很想让装饰器使用某种优先级队列/排名模式。

可以使用__dict__。例如

[fn for name, fn in WidgetFrobber.__dict__.iteritems() if "FrobAttempt" in name]

会给你一组你正在寻找的方法,但如果有一种方法可以构建更清晰的代码,我建议使用__dict__之类的东西并且不访问 python 内部。而且几乎总是应该有。

关于python - 使用内省(introspection)来查找对象的方法,然后进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8772614/

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