反射
反射
- 用字符串数据类型的名字,来操作这个名字对应的函数/实例变量/绑定方法/各种方法
- 使用场景:
- 反射对象的实例变量
- 反射类的静态变量/绑定方法、其他方法
- 反射模块当中的所有变量(被导入的叫模块),当前执行的文件叫脚本)
getattr
-
getattr(对象/地址,要调用的属性或方法) 最后得到一个地址
-
反射,实例属性,静态变量,方法,模块
class A: sex='女' def __init__(self,name,age): self.name=name self.__age=age def age1(self): print(f'我今年{self.__age}') a=A('baoli',20) print(getattr(a,'name')) #反射对象的实例变量 getattr(a,'age1')() #发射方法 print(getattr(A,'sex')) #反射静态变量 # 反射模块 import sys a=[1,2,3] b='sdfghj' def c(): return 'hanshu' print(getattr(sys.modules['__main__'],'a')) print(getattr(sys.modules['__main__'],'b')) print(getattr(sys.modules['__main__'],'c')())
class Person: def __init__(self,name,age): self.name=name self.age=age def qqxing(self): print('qqxing') minmin=Person('minmin',19) xiaotong=Person('xiaotong',20) print(getattr(minmin,'name')) #获取敏敏这个对象的name print(getattr(xiaotong,'name')) #获取xiaotong这个对象的name 结果和这个一样print(xiaotong.name) ret=getattr(xiaotong,'qqxing') # print(ret) #得到一个函数地址 结果和这个一样print(xiaotong.qqxing)
-
在归一化设计的时候反射模块
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def qqxing(self):
print('qqxing')
minmin=Person('minmin',19)
xiaotong=Person('xiaotong',20)
print(getattr(minmin,'name')) #获取敏敏这个对象的name
print(getattr(xiaotong,'name')) #获取xiaotong这个对象的name 结果和这个一样print(xiaotong.name)
ret=getattr(xiaotong,'qqxing') #
print(ret) #得到一个函数地址 结果和这个一样print(xiaotong.qqxing)
#
# ret()
#
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): #Payment就是抽象类
@abstractmethod
def pay(self,money):pass
class Ailpay(Payment):
def __init__(self,name):
self.name=name
def pay(self,money):
dic={'aname':self.name,'price':money}
print(f'{self.name}通过支付宝支付了{money}元')
class WeChat(Payment):
def __init__(self,name):
self.name=name
def pay(self,money):
dic={'aname':self.name,'money':money}
print(f'{self.name}通过微信支付了{money}元')
class Apple(Payment):
def __init__(self,name):
self.name=name
def pay(self,money):
dic={'aname':self.name,'money':money}
print(f'{self.name}通过苹果支付了{money}元')
#归一化设计
import sys
def pays(name,price,kind):
class_name=getattr(sys.modules['__main__'],kind)
obj=class_name(name)
obj.pay(price)
pays('xiaotong',100,'WeChat')
pays('wangminmin',200,'Ailpay')
pays('baoli',300,'Apple')
hasattr
- 检查对象是否拥有某个属性,时候可以反射如果存在返回True,如果不存在返回Flase
- hasattr经常和getattr配合使用
class A:
sex='女'
def __init__(self,name,age):
self.name=name
self.__age=age
def age1(self):
print(f'我今年{self.__age}')
a=A('baoli',20)
if hasattr(a,'age1'): #判断方法是否可以被反射
if callable(getattr(a,'age1')): #判断方法是否可以被调用
getattr(a,'age1')() #调用方法