【一】反射
【1】什么是反射
- 反射是一种程序可以判断,取出和修改其本地状态或行为的能力
- 在python中,反射主要是指通过字符串操作对象属性
【2】Python中的反射
- 同过字符串的形式操作对象相关的属性
- python一切皆为对象,都可以使用反射
【二】反射方法
【1】反射方法介绍
getatter(object,'name'[default])
hasatter(object,name)
setatter(object,name,value)
delatter(object,name)
【2】反射方法使用
(1)引入
class Car:
def __init__(self, name):
self.name = name
def wheel(self):
print('我有四个轮子')
def run(self):
print('我会跑')
car = Car(name='汽车')
print(car.name)
print(car.__dict__)
print(car.__dict__['name'])
print(dir(car))
"""
汽车
{'name': '汽车'}
汽车
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'run', 'wheel']
"""
(2)getatter
getatter(object,name[default])
class Car:
def __init__(self, name):
self.name = name
def wheel(self):
print('我有四个轮子')
def run(self):
print('我会跑')
car = Car(name='汽车')
print(getattr(car, 'name')) # 汽车
(3)hasattr
class Car:
def __init__(self, name):
self.name = name
def wheel(self):
print('我有四个轮子')
def run(self):
print('我会跑')
car = Car(name='汽车')
print(hasattr(car, 'name')) # True
print(hasattr(car, 'x')) # False
(4)setattr
setattr(object,'name',value)
class Car:
def __init__(self, name):
self.name = name
def wheel(self):
print('我有四个轮子')
def run(self):
print('我会跑')
car = Car(name='汽车')
setattr(car, 'name', '迈巴赫')
print(car.name) # 迈巴赫
(5)delattr
class Car:
def __init__(self, name):
self.name = name
def wheel(self):
print('我有四个轮子')
def run(self):
print('我会跑')
car = Car(name='汽车')
delattr(car, 'name')
【3】拓展
(1)类也是对象
- 在Python中一切皆对象,所以类也可以是反射方法中的第一个参数。
class Car:
def __init__(self, name):
self.name = name
def wheel(self):
print('我有四个轮子')
def run(self):
print('我会跑')
print(getattr(Car, 'wheel')) # <function Car.wheel at 0x000001A5F84B9760>
print(hasattr(Car, 'wheel')) # True
print(setattr(Car, 'age', 18)) # 返回一个None
print(Car.age) # 18
delattr(Car, 'wheel')
print(hasattr(Car, 'wheel')) # False
【三】反射的好处
【1】实现可插拔机制
- 反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,意味着可以在程序运行过程中动态地绑定接口的实现。
- 这种灵活性使得程序更容易扩展和维护。