动态创建类时出现Python错误

如何解决动态创建类时出现Python错误

让我们用这个文件夹结构来做一个项目:

> eval
  > a
    > __init__.py
    > a.py
  > b
    > __init__.py
    > b.py
  __init__.py
__init__.py
m.py

a 文件夹中 __init__.py内容

from eval.a.a import A

a.py内容

class A:
    def __init__(self) -> None:
        pass

    def __repr__(self) -> str:
        return "Class A"

    def __str__(self) -> str:
        return "Class A"

    def exec(self):
        a = eval('A()');
        print(a)

        b = eval('B()');
        print(b)

b 文件夹中 __init__.py内容

from eval.b.b import B

b.py内容

class B:
    def __init__(self) -> None:
        pass

    def __repr__(self) -> str:
        return "Class B"

    def __str__(self) -> str:
        return "Class B "

    def exec(self):
        a = eval('A()');
        print(a)

        b = eval('B()');
        print(b)

eval 文件夹中 __init__.py内容

from eval.a.a import A
from eval.b.b import B

__init__.py 外面的 eval 文件夹里面什么都没有。

m.py内容

from eval.a import A
from eval.b import B

a = eval('A()');
print(a)

b = eval('B()');
print(b)

直到现在它可以工作,创建我的 A() 和 B() 对象,打印:

Class A
Class B

但是如果我将 m.py 更改为:

from eval.a import A
from eval.b import B

a = eval('A()');
print(a)

b = eval('B()');
print(b)

print('Running A.exec() Now:')
a.exec()

print('Running B.exec() Now:')
b.exec()

然后我会得到:

Class A
Class B 
Running A.exec() Now:
Class A
Traceback (most recent call last):
  File "c:\dev\test\python\teste_eval\m.py",line 19,in <module>
    a.exec()
  File "c:\dev\test\python\teste_eval\eval\a\a.py",line 15,in exec
    b = eval('B()');
  File "<string>",line 1,in <module>
NameError: name 'B' is not defined

那么问题是:

  1. 如果我在创建类的文件中导入了类 A 和 B,为什么我的类 B 对 A.exec() 不可用?

  2. 如何解决?是什么意思让我的系统中的任何类都可以由任何类创建,即使是在单独的模块中(如本例中的 'eval' 模块)?

  3. 有没有比使用 eval 函数更好的动态创建这些类的方法

感谢您的支持

解决方法

我刚刚找到了一种加载所有模块的方法。

这是一个可能的解决方案:

import sys

def get_user_modules() -> list:
    ret = []
    sm = sys.modules
    for k in sm.keys():
        if (k[0] != '_'):
            if (not k.startswith('encodings.')):
                if (not (k in ['sys','builtins','nt','marshal','winreg','time','zipimport','codecs','encodings','abc','io','stat','genericpath','ntpath','os','site','os.path'])):
                    ret.append(k)
    return ret

此代码将返回:

['eval.a.a','eval.a','eval.b.b','eval.b','eval']

对于示例中使用的系统结构。

我认为最终的解决方案应该基于这个加载的模块列表。

感谢所有尝试提供帮助的人。

更新:

另一种可能是从起点到最后一个文件夹遍历文件系统,如下所示:

def get_all_modules() -> list:
    r = os.path.dirname(sys.argv[0])
    t = len(r)
    l = []
    for root,dirs,files in os.walk(r):
        s = root[t:].replace('\\','.')
        for f in files:
            if (f.endswith('.py') and (f[0:2] != '__')):
                fn = f[:-3]
                if (s != ''):
                    fn = s[1:] + '.' + fn
                l.append(fn)
    return l

然后,我可以使用:

def import_all_modules() -> str:
    um = get_all_modules()
    s  = ''
    for k in um:
        if (k != __name__):
            s = s + f'from {k} import *\n'
    return s

为了获得我需要导入和执行的所有内容:

exec(import_all_modules())

因此,我将动态导入应用程序中定义的所有类。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?