gpt4 book ai didi

python - 在Python中选择继承哪个父类

转载 作者:行者123 更新时间:2023-12-01 06:44:42 25 4
gpt4 key购买 nike

我正在努力尝试在创建类时选择要继承的父类而不影响任何子类。

类有一个金字塔结构,在顶部,我尝试选择从哪里继承:threading.Threadmultiprocessing.Process(用关于 child 类(class)的争论)。

我只在金字塔的第一层创建了一个返回基类的函数,代码如下:

class ProcessClass(object):
'''A thread with different inheritance.
'''
def __new__(cls, *args, **kwargs):
thr_type = kwargs.pop("thr_type","threading")
print("HELLO", thr_type)
if(thr_type == "threading"):
new_cls = threading.Thread
if(thr_type == "multiprocessing"):
new_cls = multiprocessing.Process
instance = super(ProcessClass, cls).__new__(obtain_thread_class(new_cls))
instance.__init__(*args, **kwargs)
return instance

def obtain_thread_class(new_cls):
class BaseClass(new_cls):
"""Class with its methods"""
def __init__(self, daemon=False, *args, **kwargs):
# THREADING
super(BaseClass, self).__init__(*args, **kwargs)
self.daemon=daemon
def hello(self):
print("Hello World")
return BaseClass

但是现在,当我尝试在子类中继承ProcessClass时,这个子类丢失了他的所有属性,并且参数无法正确传递(我认为这是由于__new__)。

子示例类是:

class ExampleClass(ProcessClass):
def __init__(self, arg1, arg2, arg3="1", *args, **kwargs):
self.list_args = [arg1, arg2]
print("arg3 is", arg3)
super(ExampleClass, self)
def hello2(self):
print("Hello from child!")

有了这个,如果我执行:

a = ExampleClass(thr_type="threading")
print(type(a))

我得到:

HELLO threading
<class '__main__.obtain_thread_class.<locals>.BaseClass'>

但是,我只能调用 hello() 而不能调用 hello2():

a.hello()
Hello World

a.hello2()
Traceback (most recent call last):

File "<ipython-input-11-2505bb83de52>", line 1, in <module>
a.hello2()

AttributeError: 'BaseClass' object has no attribute 'hello2'

我认为使用 __new__ 是破坏 child 创作的原因。

我也尝试过使用装饰器,并且看到了一些 __metaclasses__ 但在深入这些领域之前,我想知道是否有更简单的东西,因为我不是 python 专家。

此外,我不希望此更改影响我已经运行的任何程序(许多类继承自 ProcessClass,但这只是 threading.Thread 目前)。我试图让整个程序的这一更改不明显

最佳答案

最后我选择了构图。没有找到如何在运行时选择继承。但这仍然有效。

class ProcessClass(object):
'''A thread with different inheritance.
'''
def __init__(self, thr_type="multiprocessing", *args, **kwargs):
if(thr_type == "threading"):
new_cls = threading.Thread
if(thr_type == "multiprocessing"):
new_cls = multiprocessing.Process
self.thread = new_cls(*args, **kwargs)
def start(self):
return self.thread.start()

def run(self):
return self.thread.run()

关于python - 在Python中选择继承哪个父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59285121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com