【十七】Python中的反射机制(4)
【1】什么是反射?
- 反射指在程序运行过程中可以动态获取对象的信息。
- 是通过字符串的形式,导入模块;
- 通过字符串的形式,去模块寻找指定函数,并执行。
- 利用字符串的形式去对象中操作成员,一种基于字符串的驱动。
【2】Python反射中的内置函数
(1)getattr()
- getattr():
- 用于获取对象中的属性
- 但是其不能获取私有变量也就是最前面带
__
的属性或方法
getattr(object,name,default)其有三个参数
- object:对象
- name:对象中的属性值
- default:可选 该对象中不存在该属性的时候的返回值。
- 示例
class B:
def __init__(self):
self.name = 'Bb'
self.age = 40
def add(self):
print('B')
if __name__ == '__main__':
b = B()
print(getattr(b, 'name', 'not found')) # 输出:Bb
print(getattr(b, 'cc', 'not found')) # 输出:not found
func = getattr(b,'add',None)
print(func) # 输出:<bound method B.add of <__main__.B object at 0x00000248C7F48648>>
func() # 输出:B
(2)hasattr()
-
hasattr(object,name)
- 该函数用于检测对象(object)中是否含有name (指的是某个属性名而并不是指name) 这个属性
- 其中object是对象
- name是指需要检查该对象中是否存在的属性的名称。
- 该函数用于检测对象(object)中是否含有name (指的是某个属性名而并不是指name) 这个属性
-
示例
class B:
def __init__(self):
self.name = 'Bb'
self.age = 40
def add(self):
print('B')
if __name__ == '__main__':
b = B()
print(hasattr(b, 'ccc')) # False
print(hasattr(b, 'add')) # True
(3)setattr()
-
setattr(object,name,value)
- 是指给某个对象某个属性设置指定的值
- object是对象
- name是对象中的属性名
- value是你想要设的值。
- 其中三个参数都是必须的填的。
- 是指给某个对象某个属性设置指定的值
-
该函数可以给对象增加新的属性并且可以将对象中的方法改变。
-
示例
class B:
def __init__(self):
self.name = 'Bb'
self.age = 40
def add(self):
print('B')
if __name__ == '__main__':
b = B()
print(b.age) # 40
setattr(b,'age',50)
print(b.age) # 50
def cc():
print('i am changed')
b.add() # B
setattr(b,'add',cc)
b.add() # i am changed
# print(dir(b))
(4)delattr()
-
delattr(object,name)
- 指删除对象中的指定属性
- 其中object是对象
- name是对象中的属性名。
- 指删除对象中的指定属性
-
示例
class B:
def __init__(self):
self.name = 'Bb'
self.age = 40
def add(self):
print('B')
if __name__ == '__main__':
b = B()
print(dir(b)) # [,'add', 'age', 'name'] dir()函数会输出一大堆,在这里我把输出的一些属性名直接删除了
print(hasattr(b,'age')) # True
delattr(b,'age')
print(dir(b)) # [,'add', 'name']
print(hasattr(b,'age')) # False
我在这里再补充说明下dir() 这个函数: dir()不带变量时候用于获取当前范围内的变量、方法和定义的类型列表;带参数时返回参数的属性、方法列表。
dir(object) object:对象、变量、类型
- 以上就是python反射中的四个内置函数。
【3】Python反射的应用
- 反射的一个应用就是web框架中的url路由
- 用户通过输入url路由就可以定位到views视图中的函数
- 这里面主要应用了getattr() 这个函数(一个用于获取views视图中对应函数)
- 如果没有就返回你设定的值以此判断是否可以往下执行。