一个python类是否可以声明为与另一个类具有相同的__init__()签名(包括默认值)



考虑以下包装器:

class SomeClass:
def __init__(arg1='default1', arg2='default2'):
# initialize stuff
def do_stuff(self):

class SomeClassWrapper:
def __init__(arg1='default1', arg2='default2'):
self.arg1 = arg1
self.arg2 = arg2

def doit(self):
instance = SomeClass(arg1, arg2)
instance.do_stuff()

CCD_ 1用于延迟CCD_ 2对象的实例化,并在每次需要执行CCD_。

CCD_ 4被初始化为"0";模板";需要稍后初始化SomeClass对象,这些对象的实际初始化列表比示例中的要长得多,并且随着项目的发展可能会发生更改。

目标是通过不必手动在SomeClassWrapper.__init__()中重新键入与SomeClass.__init__()中相同的参数列表(包括默认值(来减少错误和维护负担。

有没有一种方法,也许使用inspect模块,可以按照下面的思路做一些事情?

class SomeClassWrapper:
# syntax to say:
#  __init__() should be the same as SomeClass.__init__()  
#  the arguments should be stored in say self.kwargs

def doit(self)
instance = SomeClass(self.kwargs)
instance.do_stuff()

与其重复传递的参数,不如让包装器接受创建对象的可调用零参数。

class SomeClass:
def __init__(arg1='default1', arg2='default2'):
# initialize stuff
def do_stuff(self):
...

class SomeClassWrapper:
def __init__(self, maker):
self.maker = maker
def doit(self):
instance = self.maker()
instance.do_stuff()

呼叫者仍然提供所有的细节,但以稍微不同的方式

# Old version
# w = SomeClassWrapper('foo', 'bar)
# One option
w = SomeClassWrapper(lambda: SomeClass('foo', 'bar'))
# Another option
from functools import partial
w = SomeClassWrapper(partial(SomeClass, 'foo', 'bar'))

您可以将包装器用作从中继承的模板,并为每个需要包装器的类创建新的包装器。

class SomeClass:
def __init__(self, arg1='default1', arg2='default2'):
# Initialize stuff
def do_stuff(self):
# Do stuff

class AnotherClass:
def __init__(self, hello='a'):
# Initialize stuff
def do_stuff(self):
# Do stuff

class BaseClassWrapper:
instance_class = None
def __init__(self, *args, **kwargs):
self.args   = args
self.kwargs = kwargs

def doit(self):
instance = self.instance_class(*self.args, **self.kwargs)
instance.do_stuff()

class SomeClassWrapper(BaseClassWrapper):
instance_class = SomeClass
class AnotherClassWrapper(BaseClassWrapper):
instance_class = AnotherClass

wrapper1 = SomeClassWrapper('arg1', arg2='arg2')
wrapper1.doit()
wrapper2 = AnotherClassWrapper('goodbye')
wrapper2.doit()

相关内容

最新更新