反射--getattr
反射:
用字符串数据类型的名字,来操作这个名字对应的函数/实例变量/绑定方法/各种方法
比如:name = 'alex',你想通过name查询其对应的值,但是你只能得到name的字符串形式'name'
所以使用反射 ---> getattr(obj, obj中字符串形式的变量/方法/类)
反射对象:
1.对象的实例变量
2.类的静态变量、绑定方法、其它方法
3.模块中的所有变量
被导入的模块--模块 import 模块名 getattr(模块,'变量/方法/类')
当前执行的py文件--脚本 getattr(sys.modules['__main__' 或 __name__], '变量/方法/类')
class Person(object): def __init__(self, name, age): self.name = name self.age = age def qqxing(self): print('QQ星') alex = Person('alex', 36) ret = getattr(alex, 'name') # 得到对象alex中实例变量name的值 print(ret) ret = getattr(alex, 'qqxing') # 得到对象alex中qqxing函数的地址 ret() # 调用qqxing函数
应用小场景:
class Pay(object): # 抽象类 def pay(self, money): """只要见到项目中有这种类,你的子类中必须实现和play同名的方法""" raise NotImplementedError('请在子类中重写与父类同名的方法') class AliPay(Pay): def __init__(self, name): self.name = name def pay(self, money): dic = {'uname':self.name, 'price':money} print(f'{self.name}通过支付宝成功支付{money}元!') class WeChatPay(Pay): def __init__(self, name): self.name = name def pay(self, money): dic = {'uname':self.name, 'price':money} print(f'{self.name}通过微信成功支付{money}元!') class ApplePay(Pay): def __init__(self, name): self.name = name def pay(self, money): dic = {'uname': self.name, 'price': money} print(f'{self.name}通过苹果支付支付了{money}元!') # 归一化设计: import sys def pay(name, price, pay_kind): ret = getattr(sys.modules['__main__'], pay_kind) # 通过getattr方法获取本模块中的类的地址 obj = ret(name) obj.pay(price) pay('alex', 400, 'WeChatPay') pay('wusir', 300, 'AliPay') pay('eva-j', 500, 'ApplePay') # 反射被导入模块中的变量 sys.path.append(r'F:\Lnh_Study\lnh_02_面向对象\lnh_01_类_定义方法_调用方法') import test1 as mod_a ret = getattr(mod_a, 'a') print(ret)