假设我有一些非常长的函数module.my_function
,它是这样的:
def my_function(param1,param2,param3='foo',param4='bar',param5=None,...)
有大量的args和关键字args。我希望这个函数既可以作为模块module
的一部分使用,也可以作为myClass
的类方法使用。该函数的代码将保持完全相同,但在myClass
中,一些关键字args可能采用不同的默认值。
最好的方法是什么?以前我做过类似的事情:
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
的代码是非常长。有什么想法吗?
答案 0 :(得分:1)
你可以通过调用它的__get__
方法将函数转换为bound方法(因为所有函数都是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}