首页 > 解决方案 > 在扩展类 __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但这似乎……很糟糕。

标签: pythoninheritance

解决方案


您可以使用constructor_fnin __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')

推荐阅读