python反射方法和基本使用
首先我们要知道什么是反射?
反射: 反射是一种基于基线的事件驱动,它可以通过字符串的形式,导入模块,通过串口的形式,去模块查找指定函数,并执行,利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员。
以上是比较正式的理解,通俗的讲就是通过字符串实现函数的功能。
python中反射有以下4种:
getattr(obj[models], str,[,default])
获取obj或models中是否有预str同名的方法或函数,返回返回值为str同名方法的对象,如果没有则直接报错。通过设置default默认返回值,可以避免出现报错。hasattr(obj[models], str)
判断obj或models中是否有预str同名的方法或函数,返回值为bool
值,一般与getatter搭配使用。delattr(obj[class_name], str)
删除obj/类成员的值,str为要删除的成员值。setattr(obj[class_name], str)
设置对象/类成员的值,str为要设置的成员值。
接下来对各个方法的具体使用用例子表示
getattr()
首先我们new两个python文件,common.py和attribute.py
./common.py
def eat():
print("我在吃饭!")
./attribute.py
import common
def get_eat():
eat_func = getattr(common, 'eat')
eat_func() # 我在吃饭!
get_eat()
执行attribute.py中的代码
我在吃饭!
执行eat_func()
与直接执行eat()
得到的结果是一样的。
hasattr()
import common
def is_hasattr():
is_eat_func = hasattr(common, 'eat')
print(is_eat_func) # True
is_hasattr()
执行is_hasattr函数
True
delattr()
和setattr()
的实现方法是一样的,这两个一般用得也比较少
setattr()
def eat(self):
print("%s今晚吃什么"%self.name)
class Person(object):
def __init__(self,name):
self.name = name
person = Person("libai")
setattr(person,"potato",eat) # 将eat添加到person对象中,并命名为potato
food.talk(person)
delattr()
class Person(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s今晚吃什么"%self.name)
person = Person("libai")
delattr(p,"name") # 删除Person类中的name变量
#反射作用