How to iterate through classes of file in python?

Viewed 241

I have a file called models with few classes and I need to iterate throw them in order to get each class to preform the same task on it.

my problem:

from django.contrib import admin
from . import models
# this is very repetetive
admin.site.register(models.Myclass)
admin.site.register(models.MySecondclass)
admin.site.register(models.MyThirdclass)
#.
#. 
#...

my goal:

from django.contrib import admin
from . import models


for class in models:
   admin.site.register(class)

  • If you can't understand django
# models.py
import example

class Component():
    return example.Component

class Post():
    return "Post"

class Comment():
    return "Comment"
# the goal file
from . import models
# i need to get my models as list [Component,Post,Comment]
1 Answers

Using inspect.getmembers with passing inspect.isclass as its second argument for predicate will give classes. To further filter to prevent other classes imported from somewhere else, ensure __module__ is "models":

import inspect

classes = [obj
           for _, obj in inspect.getmembers(models, predicate=inspect.isclass)
           if obj.__module__ == "models"]

gives classes as

[models.Component, models.Post, models.Comment]

after which you can do your for:

for class_ in classes:
   admin.site.register(class_)

(using class_ to not override class of Python).

Related