反射
1.什么是反射
反射的概念由smith1982年首次提出,就是指程序可以访问,检测和修改他本身状态或者行为的
一种能力(自省),他首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩

2.python中的反射:通过字符串的形式操作对象相关属性.python中的一切事物都是对象(都可以用反射)
四个可以实现自省的函数
下列方法适用类和对象(一切皆对象,类本身也是一个对象)
1.hasattr #attr在英文中是属性的意思 检测是否含有某个属性
2.getattr 获取属性
3.setattr 设置属性
4.delattr 删除属性

例子:
class Foo:
f = '类的静态变量'
def __init__(self,name,age):
self.name=name
self.age=age

def say_hi(self):
print('hi,%s'%self.name)

obj=Foo('egon',73)

#检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))

#获取属性
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')
func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))

#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错
print(obj.__dict__)


#类也是对象
class Foo(object):

staticField = "old boy"

def __init__(self):
self.name = 'wupeiqi'

def func(self):
return 'func'

@staticmethod
def bar():
return 'bar'

print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')


#反射当前模块成员
import sys


def s1():
print 's1'


def s2():
print 's2'


this_module = sys.modules[__name__]

hasattr(this_module, 's1')
getattr(this_module, 's2')


导入其他模块,利用反射查找该模块是否存在某个方法
#!/usr/bin/env python
# -*- coding:utf-8 -*-

def test():
print('from the test')

 


"""
程序目录:
module_test.py
index.py

当前文件:
index.py
"""

import module_test as obj

#obj.test()

print(hasattr(obj,'test'))

getattr(obj,'test')()

 

posted on 2018-03-12 21:59  仓鼠大人爱吃肉  阅读(139)  评论(0编辑  收藏  举报