【问题标题】:Python - Use external function as class methodPython - 使用外部函数作为类方法
【发布时间】:2016-07-24 05:12:27
【问题描述】:

假设我有一些很长的函数 module.my_function 是这样的:

def my_function(param1,param2,param3='foo',param4='bar',param5=None,...)

带有大量的args和关键字args。我希望这个函数既可以用作模块module 的一部分,也可以用作myClass 的类方法。该函数的代码将保持完全相同,但在myClass 中,一些关键字参数可能采用不同的默认值。

这样做的最佳方法是什么?以前我在做类似的事情:

class myCLass(object):
    def __init__(self,...
    def my_function(self, param1,param2,param3='hello',param4='qaz',param5=['baz'],...):
        module.my_function(param1,param2,param3=param3,param4=param4,param5=param5,...)

将所有这些论点写这么多次似乎有点愚蠢,尤其是在大量论点的情况下。我也考虑过在类方法中做类似module.my_function(**locals()) 的事情,但我不确定如何处理self 参数,我不知道这是否会导致其他问题。

我可以直接复制粘贴函数的整个代码,但这似乎不是很有效,因为改变的只是一些默认值,my_function 的代码是 very长。有什么想法吗?

【问题讨论】:

  • 是否所有关键字 args 都必须是明确的,而您不能只使用 kwargs?
  • 原因可能是我没有太多经验的编码器......在这种情况下我将如何使用 kwargs 并将一些默认值设置为不同的值?说上面示例中的 3-5 是我要更改的那些.. 我是否只需指定参数 1-5 并使用 kwargs 其余部分?

标签: python function class methods


【解决方案1】:

你可以通过调用它的__get__方法将函数转换为绑定方法(因为所有函数都是descriptors,所以有这个方法)

def t(*args, **kwargs):
    print(args)
    print(kwargs)

class Test():
    pass
Test.t = t.__get__(Test(), Test) # binding to the instance of Test

例如

Test().t(1,2, x=1, y=2)
(<__main__.Test object at 0x7fd7f6d845f8>, 1, 2)
{'y': 2, 'x': 1}

请注意,实例也作为位置参数传递。也就是说,如果您希望函数成为实例方法,则该函数应该以这样的方式编写,即第一个参数表现为类的实例。否则,您可以将函数绑定到 None 实例和类,例如 staticmethod

Test.tt = t.__get__(None, Test)
Test.tt(1,2,x=1, y=2)
(1, 2)
{'y': 2, 'x': 1}

此外,使其成为classmethod(第一个参数是类):

Test.ttt = t.__get__(Test, None) # bind to class
Test.ttt(1,2, x=1, y=2)
(<class '__main__.Test'>, 1, 2)
{'y': 2, 'x': 1}

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2015-10-04
    • 1970-01-01
    • 2021-11-21
    • 2013-04-02
    • 2019-03-06
    相关资源
    最近更新 更多