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
我需要更改一个 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