简体   繁体   中英

how to import classes from one module and initialise and run it in django

How to import classes from all .py in a module with same structure and run by iterating over it. For Example,

module_one:

script_a:
    class A:
        def __init__(self,**kwargs):
            code here
        def run(self,**kwargs):
            code here
        def finish(self,**kwargs):
            code here
script_b:
    class B:
        def __init__(self,**kwargs):
            code here
        def run(self,**kwargs):
            code here
        def finish(self,**kwargs):
            code here
and so on ...

module_two:

script:
    class Run:
        def run_all(self,**kwargs):
            for class in classes_from_module_one:
                c = class()
                c.run()
                c.finish()

First of all, please note that module refers to python file, while to what you refer as module is usually called a package.

Now, for your problem, you could use some mixture of utilities found in pkgutil , importlib , and inspect or simple dir() . For example, using walk_modules and get_members :

# pack/mod_a.py
class A:
    def __init__(self):
        pass

    def run(self):
        print("A run!")

    def finish(self):
        print("A finished!")

# pack/mod_b.py
class B:
    def __init__(self):
        pass

    def run(self):
        print("B run!")

    def finish(self):
        print("B finished!")

# all.py
from importlib import import_module
from inspect import getmembers
from pkgutil import iter_modules


class Run:
    def run_all(self, **kwargs):
        modules = iter_modules(["pack"])
        for module in modules:
            members = getmembers(import_module(f"pack.{module[1]}"))
            my_classes = [member for name, member in members if not name.startswith("_")]
            for cls in my_classes:
                c = cls()
                c.run()
                c.finish()


if __name__ == '__main__':
    run = Run()
    run.run_all()

The output is:

A run!
A finished!
B run!
B finished!

However for this solution you have to note, that getmembers will return all members of module - including built-ins, and imported entities to the modules - so you will have to implement your own check to properly filter-out those unwanted (see simple startswith in my example).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM