3 回答

TA貢獻1871條經驗 獲得超13個贊
您可以同時獲得:
import importlib, inspect for name, cls in inspect.getmembers(importlib.import_module("myfile"), inspect.isclass):
您可能還想檢查:
if cls.__module__ == 'myfile'

TA貢獻1890條經驗 獲得超9個贊
萬一它幫助別人。這是我使用的最終解決方案。此方法返回在特定包中定義的所有類。
我將 X 的所有子類保存在特定文件夾(包)中,然后,使用此方法,我可以加載 X 的所有子類,即使它們尚未導入。(如果它們尚未導入,則無法通過 訪問它們__all__;否則事情會容易得多)。
import importlib, os, inspect
def get_modules_in_package(package_name: str):
files = os.listdir(package_name)
for file in files:
if file not in ['__init__.py', '__pycache__']:
if file[-3:] != '.py':
continue
file_name = file[:-3]
module_name = package_name + '.' + file_name
for name, cls in inspect.getmembers(importlib.import_module(module_name), inspect.isclass):
if cls.__module__ == module_name:
yield cls

TA貢獻1874條經驗 獲得超12個贊
這有點冗長,但您首先需要將文件作為模塊加載,然后檢查其方法以查看哪些是類:
import inspect
import importlib.util
# Load the module from file
spec = importlib.util.spec_from_file_location("foo", "foo.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
# Return a list of all attributes of foo which are classes
[x for x in dir(foo) if inspect.isclass(getattr(foo, x))]
添加回答
舉報