我想这样做:
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)
有人能做到
^{pr2}$还有一些神奇的机器学习;最后一点我并不特别感兴趣,这只是我第一次想到的事情,作为在函数上下文中和从调用方的角度演示静态方法的使用。在
无论如何,这不起作用,因为is_silly_enough
实际上不是一个函数:它是一个对象,其__get__
方法将返回原始的is_silly_enough
函数。它的“正常”意味着只有当它作为一个被引用的对象时。有问题的对象是由staticmethod()
函数创建的,该函数位于SillyWalk
的is_silly_enough
属性和最初用该名称定义的函数之间。在
这意味着为了从中使用默认值appraisal_method
或者其调用者,我们必须
appraisal_method.__get__(instance, owner)(...)
,而不是仅仅调用appraisal_method(...)
appraisal_method
。在考虑到这两种解决方案似乎都不是特别的Python™,我想知道是否有更好的方法来获得这种功能。实际上,我希望有一种方法来指定方法在默认情况下应该使用在同一类范围内定义的特定类或静态方法来执行其日常例程的某些部分。
我不希望使用None
,因为我想让None
传达不应调用该特定函数的消息。我想我可以使用其他一些值,比如False
或{
最好的办法是什么?在
不确定我是否能得到你想要的,但是使用getattr会更干净吗?在
也许你首先需要的只是使用函数(而不是方法)?在
请注意,evaluation的默认函数现在将是一个函数而不是一个方法,即使ismully_ough在创建类之后(在代码末尾)将被绑定为类方法。在
这意味着
^{pr2}$但是
您可以用walk参数调用is\u-sly-unough,或使用.is\u-sly-yu-enough()调用walk实例。在
如果你真的想成为一个静态的方法,你可以随时添加
在定义步行之后的任何地方。在
最后我编写了一个(un)包装器函数,用于函数定义头中,例如
这似乎真的很管用,至少它能让我那些不经检验就失效的医生们通过了。在
这里是:
^{pr2}$更新:
我为
unstaticmethod
函数本身编写了doctest;它们也通过了。我仍然不能完全确定这是一个真正明智的做法,但它似乎确实有效。在相关问题 更多 >
编程相关推荐