在Python中迭代模块的类(但不是导入)

时间:2016-04-23 21:44:53

标签: python class oop python-3.x

我有一个包含几个继承自导入的类的模块:

# 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_carsflying_carsall_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}}并让其运行而不做任何其他事情。如果您想到其他任何方式,欢迎提出想法。

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__)