我有一个包含几个继承自导入的类的模块:
# initiate_cars.py
import electric_cars
import tradi_cars
import flying_cars
import inspect
cls_electric_cars = inspect.getmembers(electric_cars, inspect.isclass)
cls_tradi_cars = inspect.getmembers(tradi_cars, inspect.isclass)
cls_flying_cars = inspect.getmembers(flying_cars, inspect.isclass)
all_cars = []
for cls_car in cls_electric_cars + cls_tradi_cars + cls_flying_cars:
# inspect.getmembers returns a list of tuples
# with the class as each tuple's second member
all_cars.append(cls_car[1])
从另一个模块,我正在做以下事情:
electric_cars
除了一个问题外,一切运作良好:每个模块tradi_cars
,flying_cars
,all_cars
的导入都会进入all_cars
。
因此,使用上面的代码,[
<class 'car.ElectricCar'>, # i don't want this
<class 'cars.electric_cars.Tesla'>,
<class 'cars.electric_cars.Faraday'>,
<class 'cars.electric_cars.Zoe'>,
<class 'car.TradiCar'>, # i don't want this
<class 'cars.tradi_cars.Pontiac'>,
<class 'cars.tradi_cars.Chevrolet'>,
<class 'cars.tradi_cars.Chrysler'>,
<class 'car.FlyingCar'>, # i don't want this
<class 'cars.flying_cars.SpaceX'>
]
开始:
issubclass
有没有办法在不进行复杂的父类加载和import
检查的情况下从inspect.getmembers()
加载的类中排除electric_cars.py
?
-
为了预测你在这个问题上可能出现的不应做的评论,这个结构的最终目标是能够简单地在tradi_cars.py
,{flying_cars.py
中添加一个类。 {1}}或{{1}}并让其运行而不做任何其他事情。如果您想到其他任何方式,欢迎提出想法。
答案 0 :(得分:1)
一个简单的解决方案是更改ElectricCar
模块中electric_cars
的导入方式。而不是from cars import ElectricCar
,您可以import cars
,然后在class
语句中使用完全限定名称:
import cars
class Tesla(cars.ElectricCar):
...
另一种方法是为您正在执行的predicate
电话编写自己的inspect.getmembers
值:
inspect.getmembers(electric_cars, lambda x: inspect.isclass(x) and
x.__module__ == electric_cars.__name__)