【发布时间】:2023-04-01 20:17:01
【问题描述】:
我想要一个子类对象的列表,而不仅仅是它们的名称。
我是这样想的:
- 首先,使用
os.walk获取所有.py文件 - 然后使用
imp模块导入所有这些文件() - 检查这些类是否是子类
目录结构:
├── src
│ ├── __init__.py
│ └── connector.py
└── test_app
├── __init__.py
└── test.py
connector.py代码:
import imp
class BaseModel(object):
"""which I wanna check it's subclass"""
class SomeClass(object):
@classmethod
def detect_all(cls, app_path=None):
for path, subdirs, files in os.walk(app_path):
for name in files:
file_list.append(os.path.join(path, name)) if name.endswith('.py') and not name.startswith('_') else ''
for file in file_list:
imp.load_source(file.split('/')[0], file)
print(cls.get_all_subclasses(BaseModel))
@staticmethod
def get_all_subclasses(cls):
# argument cls is a target class
all_subclasses = []
for subclass in cls.__subclasses__():
all_subclasses.append(subclass)
all_subclasses.extend(SomeClass.get_all_subclasses(subclass))
test.py代码:
import os
import sys
sys.path.append('../')
sys.path.append('../src')
from src.connector import SomeClass, BaseModel
class User(BaseModel):
pass
b = User()
current_dir = os.path.dirname(os.path.realpath(__file__))
print(SomeClass.detect_all(current_dir))
但是当我运行这个文件时,结果总是循环,最后给了我一个RecursionError: maximum recursion depth exceeded。
如何满足我的需要,或如何修复此代码。
【问题讨论】:
标签: python python-3.x python-module