Python 在扩展类_init中使用基类的外部构造函数__
以下是设置: 有一个外部库,它有一个名为BaseClass的类Python 在扩展类_init中使用基类的外部构造函数__,python,inheritance,Python,Inheritance,以下是设置: 有一个外部库,它有一个名为BaseClass的类 class BaseClass(): def __init__(self, x): self.x = x def base(self): print("base class, x= {}".format(self.x)) 还有另一个外部库,它具有构造基类的函数 def constructor_fn(x): # do some cool things
class BaseClass():
def __init__(self, x):
self.x = x
def base(self):
print("base class, x= {}".format(self.x))
还有另一个外部库,它具有构造基类的函数
def constructor_fn(x):
# do some cool things
return BaseClass(x)
我想扩展基类以供自己使用,但我想使用构造基类实例的构造函数,但我不确定是否有这样做的模式
class ExtendedClass(BaseClass):
def __init__(self, x):
base_instance = constructor_fn(x)
# ?????
def extended(self):
print("cool new extended function")
有什么方法可以在扩展类中使用构造函数吗?请记住,构造函数和基类都在外部库中,我无法编辑它们
我在考虑迭代base\u instance
中的所有属性,并将它们分配给self
,但这似乎。。。坏。您可以尝试使用猴子补丁:
import external_lib
external_lib.BaseClass = ExtendedClass
import another_lib
instance = another_lib.constructor_fn()
显然,这是哈奇。并且可能会产生各种意外的副作用。您可以在中使用
constructor\u fn
,然后更改所创建实例的属性。这似乎有点老套,我自己也从未使用过,但只要在构造中没有使用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')