首页 > 解决方案 > 如何动态导入类?

问题描述

我有四个文件:main.pyMainClass.pySigClass.pyMyClassC.py. 条目是main.py。我重写了 in 的函数function_aMyClassA所以MyClassC需要设置SigClassinmain.py sig属性,所以 MainClass 继承MyclassCMyclassAin MainClass.py。我的代码如下,不继承function_a.MyClassC

这个问题解释了为什么使用中间的怪异类。

我尝试了很多方法,但我只能在空间中实现我的目标,而在TempClass空间中却做不到。main()MainClass.py__main__MainClass.py

TempClass空间中的怎么main()能被其他文件引用呢?我实在想不出办法。

如何修改代码?或者还有其他方法吗?

示例代码如下:

主要.py:

from MainClass import SigClass, main

SigClass.sig = "MyClassC"
main()
from MainClass import MainClass

MainClass.function_a()
print(MainClass.property)

主类.py:

from time import time
from SigClass import SigClass
import importlib

sig = SigClass.sig


class MyClassA:
    sig = '1'
    property = 'A'

    @classmethod
    def function_a(cls):
        cls.property = 'A'


class MainClass:
    pass


def main():
    module_name = SigClass.sig
    class_name = SigClass.sig
    module_object = importlib.import_module(module_name)
    module_class_object = getattr(module_object, class_name)

    class TempClass(module_class_object, MyClassA):
        pass

    global MainClass

    MainClass = TempClass

信号类.py

class SigClass:
    sig = 1

MyClassC.py

from MainClass import MyClassA


class MyClassC(MyClassA):
    @classmethod
    def function_a(cls):
        cls.property = 'c'
        pass

标签: pythonclassinheritance

解决方案


感谢@2e0byo 的提示,我认为以下代码最能满足我的需求:

导入MyClassCSigClass.sigSigClass.sig也是最重要的部分MainClass

class BaseClass:
    name = None
    pass


class SigClass(BaseClass):
    name = "SigClass"
    sig = 1


class MyClassA(BaseClass):
    name = "MyClassA"
    property = 'A'
    sig = 'a'

    @classmethod
    def function_a(cls):
        pass


class MyClassC(MyClassA):
    name = "MyClassC"
    property = "C"
    sig = 'c'

    @classmethod
    def function_a(cls):
        pass


class ClassCollections(BaseClass):
    classes: dict = {}

    @classmethod
    def add_class(cls, class_to_add: type(BaseClass)):
        cls.classes[class_to_add.name] = class_to_add


SigClass.sig = "MyClassC"
ClassCollections.add_class(MyClassA)
ClassCollections.add_class(MyClassC)


class MainClass(SigClass, ClassCollections.classes[SigClass.sig], MyClassA):
    pass


print(MainClass.sig)
MyClassC

推荐阅读