【发布时间】:2012-02-05 01:18:59
【问题描述】:
我的 Python 模块中有一个类,用于处理小部件。它有几种方法可以做到这一点,但我不提前知道哪些方法(如果有的话)会真正起作用,我以后可能会想出新的方法来处理小部件。此外,frobbing 小部件可能很昂贵。所以我想让我的类的一个实例能够查看自己,找到它具有的所有用于 frobb 小部件的方法,并开始尝试 frobb 小部件直到它成功,此时它应该停止关心它还没有尝试过的方法。
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 小部件,直到成功 frobbed 小部件(此时它应该停止关心其他方法)或者它用完了可能的方法。由于这是我的代码,我可以确保 whateverFrobAttempt 方法都具有相同的命名约定和所需的参数。 最好对方法列表进行排序,以便首先尝试平均速度较高的方法,但如果以随机顺序尝试它们也是可以接受的。
有没有一种健全的方法可以做到这一点,当添加新的weirdFrobAttempt 方法时,它们会被自动尝试,还是我最好只维护这些方法的硬编码列表并对其进行迭代?
【问题讨论】:
-
显式注册机制怎么样?一个小部件可以调用
register_frobbing_method()来注册一个新的 frobbing 方法。这将避免任何黑魔法并使过程明确。 -
您应该完全扩展该想法并使其成为答案。 :)
-
您可以使用
dir(WidgetFrobber)获取类属性列表,或在实例上调用dir获取实例属性。但 Sven Marnach 的建议更好。 -
WidgetFrobber类的意义何在?为什么小部件不能自检? -
Ekhumoro:这些小部件正在自我欺骗。这只是一个需要付出多少努力的问题——破解一个小部件是昂贵的,所以我不想在已经成功后继续尝试。
标签: python oop metaprogramming introspection