zoukankan      html  css  js  c++  java
  • Python系列之反射、面向对象

    一、反射

    getattr # 根据字符串的形式,去对象中找成员。
    hasattr # 根据字符串的形式,去判断对象中是否有成员。
    setattr # 根据字符串的形式,动态的设置一个成员(内存)
    delattr # 根据字符串的形式,动态的删除一个成员(内存)

    说反射之前先介绍一下__import__方法,这个和import导入模块的另一种方式

    1. import  commons
    2. __import__('commons') 

    如果是多层导入:

    1. from list.text import commons 
    2. __import__(' list.text.commons',fromlist=True) #如果不加上fromlist=True,只会导入list目录

    反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr  获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子

    class Foo(object):
     
        def __init__(self):
            self.name = 'abc'
     
        def func(self):
            return 'ok'
     
    obj = Foo()     #类+()获取的是对象
    #获取成员
    ret = getattr(obj, 'func')#获取的是个对象
    r = ret()
    print(r)
    #检查成员
    ret = hasattr(obj,'func')#因为有func方法所以返回True
    print(ret)
    #设置成员
    print(obj.name) #设置之前为:abc
    ret = setattr(obj,'name',19)
    print(obj.name) #设置之后为:19
    #删除成员
    print(obj.name) #abc
    delattr(obj,'name')
    print(obj.name) #报错

    对于反射小节:

    1.根据字符串的形式导入模块。
    2.根据字符串的形式去对象(某个模块)中操作其成员
    -----------------------------------------------------------------------
     上述例子的ret,
    类() #获取的是对象 ret=gatter(类(),"方法名")
    ret=类(模块,对象).方法(变量--字符串形式),第一个参数给第二个方法,类.方法执行的时函数手动传参,对象.方法执行的是方法,自动传参
    如果手动传参,传的是类的对象名
    -------------------------------------------------------

    实例:基于反射实现类Web框架的路由系统

    实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块并通过 hasattr和getattr 检查并获取函数返回值。

     https://images2015.cnblogs.com/blog/938899/201606/938899-20160602211241555-863340730.gif

  • 相关阅读:
    jquery on()方法绑定多个选择器,多个事件
    html中常用的特殊符号(转)
    jQuery自定义动画,animate()包装器方法
    纯CSS下拉菜单
    DIV水平居中的几种方法
    OOXML是什么
    Chrome网络工具总结
    Content-Length错误导致的Servlet下载文件失败问题
    Fiddler操作总结
    WinSCP上传下载过滤指定目录和文件
  • 原文地址:https://www.cnblogs.com/wxj1129549016/p/9562847.html
Copyright © 2011-2022 走看看