【问题标题】:Iterating through different classes of another script in Python在 Python 中遍历另一个脚本的不同类
【发布时间】:2021-05-25 20:24:35
【问题描述】:

我有一个包含不同类的脚本。现在我需要导入该脚本并遍历 Python 中的所有类。不知道用什么库可以实现?

例如,foo.py 有不同的类:

#foo.py
class a():
   print("a")

class b():
   print("b")

class c():
   print("c")

还有另一个脚本 myscript.py 我想导入 foo.py 并遍历所有类(伪代码):

#myscript.py
import foo
for c in foo.classes:
    #do something...

我想知道是否有图书馆可以做到这一点。

【问题讨论】:

  • 因为 myscript.py 是一个测试脚本,我需要在另一个平台上测试所有这些类。我试图获取类的名称并使用 importlib 和检查创建一个列表:for name, cls in inspect.getmembers(importlib.import_module('foo'), inspect.isclass): 但是我无法访问只有名称的类。
  • 您是否使用过标准库中的unittest?大多数(如果不是全部)测试框架都提供某种测试发现。

标签: python loops class import module


【解决方案1】:

你可以使用dir() & getattr() 来得到你想要的:

import foo

for symbol in dir(foo):
    # ignore dunder-members
    if symbol.startswith('_'):
        continue
    print(symbol)
    # here's your class 
    cl = getattr(foo, symbol)
    # here's how you can make an object
    obj = cl()
    print(obj)

输出:

a
<foo.a object at 0x10e1339a0>
b
<foo.b object at 0x10e133c70>
c
<foo.c object at 0x10e1339a0>

但是,这并不是真正可维护的代码 - 我建议进行重构以确保不需要这样做。

【讨论】:

  • 现在我尝试了 dir(),它可以工作并且返回所有类名。另一个问题是,在这些类中还有其他类我也需要访问它们!那么如果我们有符号作为类名,我就无法访问 foo.symbol!我收到此错误:AttributeError: 'module' object has no attribute 'symbol'
  • 您可以在类对象cl 上应用dir 并获取这些内部类。然后使用相同的getattr 方式访问它们。
  • 很好!!我现在都得到了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 2019-06-22
  • 2016-06-14
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多