class 可以俯视 subclass 构造函数吗?

Possible for a class to look down at subclass constructor?

我需要更改一个 class 变量,但我不知道是否可以在运行时进行,因为我使用的是第三方开源软件,而且我对纯 python 继承(我使用的软件提供自定义继承系统)和 python 一般。我的想法是继承 class 并更改构造函数,但是对象是用原始软件 classname 初始化的,所以它们没有用我的 init..

初始化

我通过继承使用原始软件 class 名称和覆盖方法的 classes 部分解决了这个问题,所以现在他们使用我的 classes,但我仍然无法达到每个方法,因为其中一些是静态的。

关于我尝试做的事情的完整步骤可以在这里找到

我想我可以解决这个问题,如果我可以使用一些东西,比如装饰器或其他东西,告诉父 classes 到 'look down' 到子 class 构造函数他们被初始化。有办法吗?

我举个例子:

class A(object):

    def __init__(self):
        self.timeout = 0

    def print_class_info(self):
        print(f'Obj A timeout: {self.timeout}')


class B(A):

    def __init__(self):
        super().__init__()
        self.timeout = 10

    def print_class_info(self):
        print(f'Obj B timeout: {self.timeout}')


# Is it possible, somehow, to make obj_A use the init of B class
# even if the call to the class is on class A?

obj_A = A()
obj_B = B()

obj_A.print_class_info()
obj_B.print_class_info()

OUT:
Obj A timeout: 0
Obj B timeout: 10

当然,在实际场景中情况更复杂,所以我不确定我是否可以简单地访问对象 A 并设置 class 变量,我想我必须在运行时这样做,可能需要重新启动服务器,我什至不确定如何在运行时访问对象,正如我所说的,我对纯 python.

的体验不是很好

也许有一个简单的方法,但我只是没看到或不知道,基本上可以使用带有父 class 调用的子class 构造函数吗?

您可以将任何属性分配给 class,包括方法。这叫做monkey patching

# save the old init function
A.__oldinit__ = A.__init__

# create a new function that calls the old one
def custom_init(self):
    self.__oldinit__()
    self.timeout = 10

# overwrite the old function
# the actual old function will still exist because
# it's referenced as A.__oldinit__ as well
A.__init__ = custom_init

# optional cleanup
del custom_init