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

 

posted @ 2018-08-30 21:35  卍风衍  阅读(139)  评论(0编辑  收藏  举报