python - 在扩展类 __init__ 中使用基类的外部构造函数
问题描述
这是设置:
有一个外部库有一个名为 BaseClass 的类
class BaseClass():
def __init__(self, x):
self.x = x
def base(self):
print("base class, x= {}".format(self.x))
还有另一个外部库,其中包含构造 BaseClasses 的函数
def constructor_fn(x):
# do some cool things
return BaseClass(x)
我想扩展 BaseClass 以供自己使用,但我想使用构造 BaseClass 实例的 constructor_fn,但我不确定是否有这样做的模式。
class ExtendedClass(BaseClass):
def __init__(self, x):
base_instance = constructor_fn(x)
# ?????
def extended(self):
print("cool new extended function")
有什么办法可以在我的 ExtendedClass 中使用 constructor_fn 吗?请记住,constructor_fn 和 BaseClass 都在外部库中,我无法编辑它们。
我在想也许可以遍历所有属性base_instance
并将它们分配给,self
但这似乎……很糟糕。
解决方案
您可以使用constructor_fn
in __new__
,然后更改已__class__
创建实例的属性。这似乎有点hacky,我自己从未使用过它,但只要没有任何部分ExtendedClass
用于建筑,它应该可以工作。
这是一个最小的例子:
class BaseClass:
def __init__(self, x):
self.x = x
def __repr__(self):
return f'{type(self).__name__}({self.x!r})'
def constructor_fn(x):
return BaseClass(x + ' fn')
class ExtendedClass(BaseClass):
def __new__(cls, x):
inst = constructor_fn(x)
inst.__class__ = cls
return inst
def __init__(self, _x):
"""Parameter "_x" is ignored since it's consumed by "__new__"."""
self.x += ' ext'
for constructor in BaseClass, constructor_fn, ExtendedClass:
print(constructor('base'))
输出:
BaseClass('base')
BaseClass('base fn')
ExtendedClass('base fn ext')
推荐阅读
- sql - 计算每天的状态 ID
- php - 不能同时有两条路线
- python - Python正则表达式查找字符串中带有逗号的任何单词
- swift - 使用 Foundation 的 Measurement API 执行自定义单位转换
- node.js - NodeJS 请求返回 403
- c++ - 链表中的节点
- python-3.x - 如何在此代码上修复“'int' object is not subscriptable”
- jenkins - 哪个选项最适合将 gitlab 与 Jenkins 集成
- javascript - 使用 JavaScript 打开相同的浏览器窗口
- batch-file - 如何在批处理文件的 if 语句中获得正确的比较