• 反射--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_Studylnh_02_面向对象lnh_01_类_定义方法_调用方法')
    import test1 as mod_a
    
    ret = getattr(mod_a, 'a')
    print(ret)
  • 相关阅读:
    mybatis SQL 根据in条件语句排序
    Redis面试总结
    数据库优化之分库分表
    jdk1.6 Synchronized 优化总结
    CounDownLatch、CyclicBarrier、Semaphore
    java锁总结
    Redis 与 MySQL 双写一致性如何保证
    dubbo总结
    一、全国大学生电子设计竞赛测控(无人机)方向___基础篇
    编解码KL变换详解和哥伦布k阶编解码
  • 原文地址:https://www.cnblogs.com/GOD-L/p/13541099.html
Copyright © 2020-2023  润新知