我想做这样的事情:
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
's is_silly_enough
属性和最初用该名称定义的函数。
这意味着为了使用默认值appraisal_method
从内部either SillyWalk.walk
or它的调用者,我们必须
- call
appraisal_method.__get__(instance, owner)(...)
而不是仅仅打电话appraisal_method(...)
- 或者将其分配为某个对象的属性,然后将该对象属性作为我们调用的方法引用
appraisal_method
.
鉴于这些解决方案似乎都不是特别 Pythonic™,我想知道是否有更好的方法来获得此类功能。我基本上想要一种方法来指定方法默认情况下应使用同一类范围内定义的特定类或静态方法来执行其日常例程的某些部分。
我不想使用None
,因为我想允许None
传达不应调用该特定函数的消息。我想我可以使用其他一些值,比如False
or NotImplemented
,但似乎a)黑客行为b)令人烦恼的是必须编写额外的几行代码以及其他冗余文档,因为某些东西似乎可以非常简洁地表达为默认参数。
最好的方法是什么?