• python 反射


    python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

    反射的四个基本函数使用 hasattr,getattr,setattr,delattr

    #!/usr/bin/python
    # coding=utf-8
    
    import sys
    
    
    class Car(object):
        def __init__(self, name):
            self.name = name
    
        def start(self):
            print '%s start ...' % self.name
    
        def stop(self):
            print '%s stop ...' % self.name
    
    
    def restart(inst):
        print '%s start...' % inst.name
        print '%s stop...' % inst.name
    
    
    if __name__ == '__main__':
        car = Car("bmw")
        if hasattr(car, sys.argv[1]):  # 判断属性是否存在
            func = getattr(car, sys.argv[1])  # 获取属性 car.xx()内存地址
            print '%s func call >>' % sys.argv[1]
            func()
    
        print 'setattr restart:restart func call >>'
        setattr(car, 'restart', restart)  # 将函数绑定到实例对象
        car.restart(car)
    
        print 'setarrt car.name >>'
        print 'car name:', car.name
        setattr(car, 'name', 'benz') # 修改实例对象属性值
        print 'car name:', car.name
    
        print 'delattr restart:restart func call >>'
        delattr(car, 'restart')  # 删除实例对象属性
        try:
            car.restart(car)
        except Exception, e:
            print e
    

    运行:

    >>python oop_demo1.py start
    start func call >>
    bmw start ...
    setattr restart:restart func call >>
    bmw start...
    bmw stop...
    setarrt car.name >>
    car name: bmw
    car name: benz
    delattr restart:restart func call >>
    'Car' object has no attribute 'restart'

    用反射机制实现URL路由功能

    一、目录结构

    └─AutoMT
        │  urls.py
        │  __init__.py
        │
        └─controller
                account.py
                commons.py
                __init__.py
    

    二、代码实例

    controller/account.py:

    #!/usr/bin/python
    #coding=utf-8
    
    def login():
      print("这是一个登陆页面!")
    
    def logout():
      print("这是一个退出页面!")
    

    controller/commons.py:

    #!/usr/bin/python
    #coding=utf-8
    
    def home():
      print("这是网站主页面!")
    

    urls.py:

    #!/usr/bin/python
    # coding=utf-8
    
    def run():
        inp = raw_input("请输入您想访问页面的url:").strip()
        try:
            modules, func = inp.split("/")
            try:
                obj = __import__("controller." + modules, fromlist=True)  # 根据参数,动态的导入同名的模块,注意fromlist参数
                if hasattr(obj, func):
                    func = getattr(obj, func)
                    func()
                else:
                    print '404'
            except ImportError, e:
                print e
    
        except ValueError:
            print 'url不合规则,要求格式:controller/func'
    
    
    if __name__ == '__main__':
        while True:
            run()
    

    运行结果:

    >>python urls.py
    请输入您想访问页面的url:account/login
    这是一个登陆页面!
    
    请输入您想访问页面的url:commons/home
    这是网站主页面!
    
    请输入您想访问页面的url:account/register
    404
    
    请输入您想访问页面的url:houtai/home
    No module named houtai
    
    请输入您想访问页面的url:
    

      


    ***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
  • 相关阅读:
    2020年终总结
    vi编辑器使用基本操作
    为什么Windows下重载Nginx配置不生效
    JAVA、C#中使用正则表达式替换字符串
    领域事件、集成事件、事件总线区别与关系
    asp.net core中使用Serilog以及自定义Enricher
    C语言----文件(高阶篇二十八)
    C语言----指针与一维数组(高阶篇二十七)
    C语言----位运算(进阶篇二十六)
    C语言----指针基础(进阶篇二十五)
  • 原文地址:https://www.cnblogs.com/guanfuchang/p/6242285.html
Copyright © 2020-2023  润新知