python - 可以将 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()
SomeClassWrapper
是否可以延迟SomeClass
对象的实例化并在每次do_stuff()
需要执行时抽象出新实例的创建。
SomeClassWrapper
使用稍后初始化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'))
推荐阅读
- angular - Angular 8 应用程序部署在 docker 中的 nginx 上 - GET、PUT、POST、PATCH 不起作用
- javascript - 如何知道具体化 css 模式是否打开
- azure - 未使用流分析作业从 Azure Blob 获取完整记录
- ios - Swift 在键盘上方添加视图获取错误无法分配给属性:'inputAccessoryView' 是仅获取属性
- c# - 有没有办法在 GMap.NET 应用程序上保存覆盖/多边形,以便每次都可以非常快速地重新加载它们
- google-cloud-platform - Google Cloud Spanner 是否支持索引交集/组合/合并?
- npm - `npm run watch` 不在开发模式下编译,但在生产中编译(-p 标志)
- python-3.x - 访问列表中的字典元素
- python - Python如何阻止atom-beautify包进行分行?
- python-3.x - 如何标准化元组中的分布?