反射

反射

  • 用字符串数据类型的名字,来操作这个名字对应的函数/实例变量/绑定方法/各种方法
  • 使用场景:
    • 反射对象的实例变量
    • 反射类的静态变量/绑定方法、其他方法
    • 反射模块当中的所有变量(被导入的叫模块),当前执行的文件叫脚本)

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')()   #调用方法


posted @ 2021-06-03 16:43  刘家小仙女  阅读(26)  评论(0编辑  收藏  举报