gpt4 book ai didi

python - 在同一类的方法中使用类/静态方法作为默认参数值

转载 作者:太空狗 更新时间:2023-10-30 01:10:31 25 4
gpt4 key购买 nike

我想做这样的事情:

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功能。这意味着它仅在作为对象属性被引用时才以“正常”方式工作。有问题的对象是由装饰器放在 SillyWalkis_silly_enough 属性和最初定义的函数之间的 staticmethod() 函数创建的用那个名字。

这意味着为了使用 appraisal_method 的默认值,要么 SillyWalk.walk 要么它的调用者,我们要么

  • 调用 appraisal_method.__get__(instance, owner)(...) 而不是仅仅调用 appraisal_method(...)
  • 或将其分配为某个对象的属性,然后将该对象属性引用为我们调用的方法,就像我们调用 appraisal_method 一样。

鉴于这两种解决方案似乎都不是特别 Pythonic™,我想知道是否有更好的方法来获得这种功能。我本质上想要一种方法来指定一个方法在默认情况下应该使用在同一类范围内定义的特定类或静态方法来执行其日常例程的某些部分。

我不想使用 None,因为我想让 None 传达不应调用该特定函数的消息。我想我可以使用一些其他值,比如 FalseNotImplemented,但看起来 a) hackety b) 不得不多写几行代码很烦人,因为以及其他冗余文档,对于一些看起来可以非常简洁地表达为默认参数的东西。

执行此操作的最佳方法是什么?

最佳答案

也许您首先需要的是使用函数(而不是方法)?

class SillyWalk(object):
def is_silly_enough(walk):
return (False, "It's never silly enough")

def walk(self, appraisal_function=is_silly_enough):
self.do_stuff()
(was_good_enough, reason) = appraisal_function(self)
if not was_good_enough:
self.execute_self_modifying_code(reason)
return appraisal_function
def do_stuff(self):
pass
def execute_self_modifying_code(self, problem):
deepjuju.kiss_booboo_better(self, problem)

请注意,尽管 is_silly_enough 将在创建类后(在代码末尾)绑定(bind)为类方法,但现在 appraisal_function 的默认值将是一个函数而不是方法。

这意味着

>>> SillyWalk.is_silly_enough
<unbound method SillyWalk.is_silly_enough>

但是

>>> SillyWalk.walk.im_func.func_defaults[0] # the default argument to .walk
<function is_silly_enough at 0x0000000002212048>

您可以使用 walk 参数调用 is_silly_enough,或使用 .is_silly_enough() 调用 walk 实例。

如果你真的想让 is_silly_enough 成为一个静态方法,你总是可以添加

    is_silly_enough = staticmethod(is_silly_enough)

walk 定义之后的任何位置。

关于python - 在同一类的方法中使用类/静态方法作为默认参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3083692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com