我想做这样的事情:
class SillyWalk(object):
@staticmethod
def is_silly_enough(walk):
return (False, "It's never silly enough")
def walk(self, appraisal_method=is_silly_enough):
self.do_stuff()
(was_good_enough, reason) = appraisal_method(self)
if not was_good_enough:
self.execute_self_modifying_code(reason)
return appraisal_method
def do_stuff(self):
pass
def execute_self_modifying_code(self, problem):
from __future__ import deepjuju
deepjuju.kiss_booboo_better(self, problem)
想法是有人可以做
>>> silly_walk = SillyWalk()
>>> appraise = walk()
>>> is_good_walk = appraise(silly_walk)
并且还会发生一些神奇的机器学习;这最后一点对我来说并不是特别感兴趣,它只是我想到的第一件事,作为在函数内上下文和从调用者的角度举例说明静态方法使用的一种方式。
无论如何,这不起作用,因为is_silly_enough
它实际上不是一个函数:它是一个对象,其__get__
方法将返回原始is_silly_enough
函数。这意味着它仅在作为对象属性引用时以“正常”方式工作。有问题的对象是由staticmethod()
装饰器放置在SillyWalk
' 的is_silly_enough
属性和最初使用该名称定义的函数之间的函数创建的。
这意味着为了在其中一个或其调用者中使用 from 的默认值,我们appraisal_method
必须要么 SillyWalk.walk
- 打电话
appraisal_method.__get__(instance, owner)(...)
而不只是打电话appraisal_method(...)
- 或将其分配为某个对象的属性,然后将该对象属性作为我们调用的方法引用,就像我们调用的那样
appraisal_method
。
鉴于这些解决方案似乎都不是 Pythonic™,我想知道是否有更好的方法来获得这种功能。我本质上想要一种方法来指定方法默认情况下应使用在同一类范围内定义的特定类或静态方法来执行其日常工作的某些部分。
我不想使用None
,因为我想允许None
传达不应调用该特定函数的信息。我想我可以使用其他一些值,例如False
or NotImplemented
,但似乎 a) 很麻烦 b) 不得不编写额外的几行代码以及其他冗余文档很烦人,因为它似乎可以表达非常简洁地作为默认参数。
最好的方法是什么?