zoukankan      html  css  js  c++  java
  • 反射

    反射

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

    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')()
    
  • 相关阅读:
    管道和FIFO
    2.Qt Creator的使用
    1.新手上路:Windows下,配置Qt环境
    系统数据文件和信息
    使用Python与数据库交互
    与文件和目录操作相关的函数
    使用Python处理Excel文件的一些代码示例
    使用Python处理CSV文件的一些代码示例
    【Jenkins】发布报错“error: RPC failed; curl 18 transfer closed with outstanding read data remaining”
    Linux之文本处理命令
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13200276.html
Copyright © 2011-2022 走看看