我想做这样的事情:
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)
Run Code Online (Sandbox Code Playgroud)
这个想法是有人可以做的
>>> silly_walk = SillyWalk()
>>> appraise = walk()
>>> is_good_walk = appraise(silly_walk)
Run Code Online (Sandbox Code Playgroud)
还有一些神奇的机器学习正在发生; 最后一点对我来说并不是特别感兴趣,这只是我发现的第一件事,它是在函数上下文和调用者的角度来举例说明静态方法的使用.
无论如何,这不起作用,因为is_silly_enough它实际上不是一个函数:它是一个对象,其__get__方法将返回原始is_silly_enough函数.这意味着它仅在作为对象属性引用时以"正常"方式工作.有问题的对象是由staticmethod()装饰器放入SillyWalk的is_silly_enough属性和最初用该名称定义的函数之间的函数创建的.
这意味着,为了appraisal_method在其中一个 SillyWalk.walk 或它的调用者中使用from 的默认值,我们必须要么
appraisal_method.__get__(instance, owner)(...)而不是打电话appraisal_method(...)这对我来说是这样的:
class SomeName:
def __init__(self):
self.value = "something"
def some_method(self):
print self.value
def external_func(instance, method):
method(instance)
external_func(SomeName(), SomeName.some_method)
Run Code Online (Sandbox Code Playgroud)
这似乎正常工作。这是正确的方法吗?
我想要做的是:将foo函数指针bar作为默认参数传递给函数。但这是不允许的。如何实施?
class Klass ():
def __init__(self):
print('init')
def foo(self):
print('foo')
def bar(self, func=self.foo): # error here
func()
print('bar')
Run Code Online (Sandbox Code Playgroud)