zoukankan      html  css  js  c++  java
  • python:反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
    四种形式:getattr
    setattr delattr hasattr
    getattr(obj,name)
    例:反射类
    # 反射对象的属性
    # 反射对象的方法
    # 反射类的属性
    # 反射类的方法:classmethod staticmethod
    class Person:
        __mongy = 1000
        nationality = 'china'
        def __init__(self,name,sex,height):
            self.name = name
            self.sex =sex
            self.__height = height
        @property
        def height(self):
            return self.__height
        @classmethod
        def money(cls):
            cls.__mongy = 0
            return 'run out of money,%s'%cls.__mongy
    
    aike = Person('aike','man','180')
    print(getattr(aike,'name'))#反射对象的属性
    print(getattr(aike,'height'))#反射对象的方法
    print(getattr(aike,'money')())#反射对象的方法
    print(getattr(Person,'money')())#反射类的方法
    print(getattr(Person,'nationality'))#反射类的属性
    
    #打印:
    aike
    180
    run out of money,0
    run out of money,0
    china
    例:反射模块
    假设有模块func,在源码下进行反射
    def login():    #函数
        print('登录成功')
    
    a = 100    #属性
    class Teacher:    #
        school = '清华'
        # @classmethod    #实现类对象
        def info_func(cls):    #对象的方法
            print('这是类中的动态属性')
    import sys
    
    # getattr(sys.modules['__main__'],'login')() #在该模块的源文件下进行反射,获取对象的方式需要用法sys模块获取
    getattr(sys.modules[__name__],'login')() #若需要在调用该模块的对象下执行该反射,需要把'__main__'换成__name__,
                                            # 原理是当我们直接执行这个模块的时候,__name__ == '__main__',
                                            # 当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'
    
    if __name__ == '__main__':
        print(sys.modules)
    func模块被调用:
    # 反射模块的属性
    #  可以反射内置模块
    # 反射模块的方法
    # 假设模块为文件夹下的func
    import func
    # func.login()#调用模块中的函数
    getattr(func,'login')()#反射模块中的函数
    # print(func.a)#调用模块中的属性
    print(getattr(func,'a'))#反射模块中的属性
    print(getattr(func.Teacher,'school'))#反射模块中的类的属性
    aike = getattr(func,'Teacher')() #反射得到类Teacher,加()则创建一个对象
    getattr(func.Teacher,'info_func')(aike)#要反射的函数有参数怎么办?传入一个符合条件的参数即可 
    hasattr:判断该对象是否有某个属性或者方法,返回Ture或False,一般和getattr配合使用
    #继续以模块func为例
    import func
    print(hasattr(func,'login'))
    if hasattr(func,'login'): #如果func有longin属性,则反射
        getattr(func,'login')()
    
    #打印:
    True
    登录成功
    setattr:设置属性
    #setattr(x, 'y', v)——>`x.y = v'
    class A:
        pass
    a = A()
    setattr(a,'name','艾克')#对象的属性
    setattr(A,'name','aike')#类的静态属性
    print(A.name)#aike
    print(a.name)#艾克
    delattr:删除属性
    class A:
        pass
    a = A()
    setattr(a,'name','艾克')#对象的属性
    setattr(A,'name','aike')#类的静态属性
    print(A.name)#aike
    print(a.name)#艾克
    
    delattr(A,'name')
    print(a.name)#艾克
    delattr(a,'name')
    print(a.name)#报错
    注意:python中的一切事物都是对象,是对象都可以使用到反射,在一个模块源码下反射模块中的属性,获取对象名的方式需要用到sys模块的modules方法:sys.modules['__main__']
    若需要在调用该模块的对象下执行该反射,需要把'__main__'换成__name__
    原理是当我们直接执行这个模块的时候,__name__返回值为'__main__',当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__返回值为'被调用的模块名字'

  • 相关阅读:
    Python测试框架:pytest
    用Python unittest搭建自动化测试框架
    unittest单元测试框架
    golang获取本地dns服务器
    Go语言HTTP请求头小写问题
    MAC上使用nginx搭建直播服务器
    go packages 学习
    Cloud Native Computing Foundation
    普通文件I/O需要两次复制,内存映射文件mmap一次复制
    page cache & buffer cache
  • 原文地址:https://www.cnblogs.com/aizhinong/p/11482145.html
Copyright © 2011-2022 走看看