Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在扩展类_init中使用基类的外部构造函数___Python_Inheritance - Fatal编程技术网

Python 在扩展类_init中使用基类的外部构造函数__

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

以下是设置:

有一个外部库,它有一个名为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
    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')