【发布时间】:2011-03-06 06:00:37
【问题描述】:
我想做这样的事情:
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 函数。这意味着它仅在作为对象属性引用时以“正常”方式工作。有问题的对象是由装饰器在SillyWalk 的is_silly_enough 属性和最初使用该名称定义的函数之间放置的staticmethod() 函数创建的。
这意味着为了在 either SillyWalk.walk 或它的调用者中使用 appraisal_method 的默认值,我们必须要么
- 调用
appraisal_method.__get__(instance, owner)(...)而不是仅仅调用appraisal_method(...) - 或将其分配为某个对象的属性,然后将该对象属性作为我们调用的方法引用,就像我们将调用
appraisal_method一样。
鉴于这两种解决方案似乎都不是 Pythonic™,我想知道是否有更好的方法来获得这种功能。我本质上想要一种方法来指定一个方法默认情况下应该使用在同一类范围内定义的特定类或静态方法来执行其日常工作的某些部分。
我不想使用None,因为我想让None 传达不应调用该特定函数的信息。我想我可以使用一些其他值,例如False 或NotImplemented,但看起来 a) 很麻烦 b) 不得不编写额外的几行代码以及其他冗余文档,这看起来很烦人似乎可以非常简洁地表示为默认参数。
最好的方法是什么?
【问题讨论】:
标签: python decorator default-value class-method static-methods