码迷,mamicode.com
首页 > 编程语言 > 详细

反射的应用 | Python

时间:2017-12-26 23:12:14      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:一个   run   turn   log   forbidden   字符串   bsp   center   class   

# 为什么要把类写在配置文件里?
# 把类名写在配置文件里,比如django,添加一个中间件配置,为什么我们就可以直接调用这个类了?
MIDDLEWARE_CLASSES = (
    应用名.middleware.ForbiddenIpsMiddleware,
)

# 其实内部做了一个反射的操作,在middleware这个模块中,
# 载入了ForbiddenIpsMiddleware这个类;
# 那么问题来了,通过这个一个字符串怎么找到这个类呢?
# 反射。

技术分享图片

# echo_one.py
  class EchoOne():
      def run(self):
          return 1
# echo_two.py
  class EchoTwo():
      def run(self):
          return 2
# echo_three.py
  class EchoThree():
      def run(self):
          return 3
# 给python解释器添加路径
import os, sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# print(os.path.abspath(__file__))
# print(os.path.dirname(os.path.abspath(__file__)))
# print(BASE_DIR)
# >> /home/python/Desktop/echo/conf.py
# >> /home/python/Desktop/echo
# >> /home/python/Desktop  # 根目录
sys.path.append(BASE_DIR)

settings = {
    ret01: echo.class01.echo_one.EchoOne,
    ret02: echo.class01.echo_two.EchoTwo,
    ret03: echo.class01.echo_three.EchoThree,
}
from conf import settings


for k,v in settings.items():
    # 要在这里循环注册配置文件中写的每个类
    # 1.将字符串拆分成‘类所在的包路径‘|‘类名‘
    module_path, classname = v.rsplit(., maxsplit=1)
    # 2.获取类所在模块对象
    import importlib
    m = importlib.import_module(module_path)
    # print(m)
    # 3.根据根据类名(模块的属性),从模块中反射出对应的类
    cls = getattr(m, classname)
    # 4.执行一下类中的方法确认操作是否正确
    print(cls().run())

 

反射的应用 | Python

标签:一个   run   turn   log   forbidden   字符串   bsp   center   class   

原文地址:https://www.cnblogs.com/pymkl/p/8120463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!