如何在python 3.5包中动态加载模块,类和属性

时间:2016-05-04 03:18:54

标签: python python-3.x python-3.5

我正在尝试在Python 3.5中构建一个包

我的代码目录如下

Get-ChildItem $dump_path -Recurse -Directory | 
    Where-Object {$_.LastWriteTime -lt $del_date } | 
    Get-ChildItem -Recurse | 
    Remove-Item -Recurse -Confirm:$False -Force -WhatIf

所有汽车都扩展了mypackage |-- requirements.txt |-- setup.py |--vehicle |-- __init__.py |-- testdrive.py |-- cars |-- __init__.py |-- basecar_abstract_class.py |-- prius.py |-- volt.py |-- leaf.py |-- tesla.py |-- civic.py |-- there could be 100 of car classes .... 中定义的抽象类。 basecar_abstract_class方法是一种抽象方法,必须在每个汽车类中定义

run代码段如下:

testdrive.py

所以我的问题是:如何为被叫车动态加载模块和类(也在评论中提到)。具体来说,我想知道有什么变化(行添加/编辑),我需要在class TestDrive(object): def __init__(self): pass def runmycar(carname): # if tesla is passed as car name, then I want # it should first load tesla from cars module *DYNAMICALLY* # so that I can call tesla's run method defined in tesla.py # vehicle.tesla.run() ?? 中进行以实现我的目标

目前testdrive.py文件夹中的__init__.py只是空的。你觉得,我还需要在那里放任何代码来实现我的目标吗?

1 个答案:

答案 0 :(得分:0)

import importlib

import cars

def runmycar(car_name):
    #car_name = 'Tesla'
    module_name = '.' + car_name.lower()

    mod = importlib.import_module(module_name, 'cars')
    cls = getattr(mod, car_name)

    obj = cls()
    obj.run()