• 反射


    反射

    用字符串数据类型的名字 来操作这个名字对应的函数实例变量绑定方法各种方法

    1.反射对象的 实例变量
    2.反射类的 静态变量/绑定方法/其他方法
    3.模块中的 所有变量
    被导入的模块
    当前执行的py文件 - 脚本

    class Person:
        def __init__(self,name ,age):
            self.name = name
            self.age = age
        def qqxing(self):
            print('qqxing')
    alex = Person('alex',83)
    ret = getattr(alex,'name')
    print(ret) #alex
    s = getattr(alex,'qqxing')
    s()#qqxing
    
    #反射模块中的 所有变量、方法
    # import a
    # print(a.Wechat)
    # print(a.Alipay)
    # # 对象名.属性名 ==> getattr(对象名,'属性名')
    # # a.Alipay ==> getattr(a,'Alipay')
    # print(getattr(a, 'Alipay'))
    # print(getattr(a, 'Wechat'))
    --------------------------------
    import a
    import sys
    print(sys.modules)
    # print(sys.modules)
    # print(sys.modules['a'].Alipay)
    # print(a.Alipay)
    # print(getattr(a,'Alipay'))
    # print(getattr(sys.modules['a'],'Alipay'))
    
    # wahaha = 'hahaha'
    # print(getattr(sys.modules['__main__'],'wahaha'))
    #sys.modules['__main__'] 本模块
    
    class Payment:pass
    class Alipay(Payment):
        def __init__(self,name):
            self.name = name
        def pay(self,money):
            dic = {'uname':self.name,'price':money}
            print('%s通过支付宝支付%s钱成功'%(self.name,money))
    
    class WeChat(Payment):
        def __init__(self,name):
            self.name = name
        def pay(self,money):
            dic = {'username':self.name,'money':money}
            print('%s通过微信支付%s钱成功'%(self.name,money))
    
    class Apple(Payment):
        def __init__(self,name):
            self.name = name
        def pay(self,money):
            dic = {'name': self.name, 'number': money}
            print('%s通过苹果支付%s钱成功' % (self.name, money))
    
    class QQpay:
        def __init__(self,name):
            self.name = name
        def pay(self,money):
            print('%s通过qq支付%s钱成功' % (self.name, money))
    import sys
    
    def pay (name,price,kind):
        class_name = getattr(sys.modules['__main__'],kind)
        obj = class_name(name)
        obj.pay(price)
    
        # if kind == 'Wechat':
        #     obj = WeChat(name)
        # elif kind == 'Alipay':
        #     obj = Alipay(name)
        # elif kind == 'Apple':
        #     obj = Apple(name)
        # obj.pay(price)
    
    # pay('alex',400,'WeChat')
    # pay('alex',400,'Alipay')
    # pay('alex',400,'Apple')
    # pay('alex',400,'QQpay')
    

    反射的另一个函数 hasattr(一般成对使用)

    class A:
        Role = '治疗'
        def __init__(self):
            self.name = 'alex'
            self.age = 84
        def func(self):
            print('wahahaha')
            return 666
    a = A()
    print(hasattr(a,'sex'))#False  是否可反射到
    print(hasattr(a,'age'))#True
    print(hasattr(a,'func'))#True
    
    if hasattr(a,'func'):
        if callable(getattr(a,'func')):   #callable 是否可被调用(既判断是否可以在后面加())
            getattr(a,'func')()
    
  • 相关阅读:
    [FJWC2018]全排列
    CYJian的新春虐题赛
    C. 新年的繁荣
    CF809E Surprise me!
    codeforces 1110F
    C. mathematican 的二进制
    [SPOJ] DIVCNT2
    CF1065F Up and Down the Tree
    Snakes 的 Naïve Graph
    「LibreOJ Round #9」CommonAnts 的调和数
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13200276.html
Copyright © 2020-2023  润新知