考虑以下包装器:
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()