• 面向对象_反射


      反射指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。

      python面向对象中的反射是指通过字符串的形式操作对象相关的属性。

      python中有四个可以实现自省的函数

    hasattr(object,name)
        判断object中有没有一个name字符串对应的方法或属性
    getattr(object,name,default=None)
        获取object的name属性,name属性入股不存在,当给定关键字参数default时则返回None;如果未设置关键字参数则报错
    seattr(x,y,z)
        设置属性:x.y=z
    delattr(x,y)
        删除属性x.y 如果属性不存在则报错

      应用实例

    class Animal():
        feature = 'live'
        def __init__(self,name,gender):
            self.name = name
            self.gender = gender
    
        def eat(self):
            print('%s is eating'%self.name)
    
        def run(self):
            print('%s is running'%self.name)
    
    animal1 = Animal('cat','female')
    #检测是否含有属性
    print(hasattr(animal1,'name'))
    print(hasattr(animal1,'eat'))
    
    #获取属性
    n=getattr(animal1,'name')
    print(n)
    func = getattr(animal1,'eat')
    func()
    #获取属性,不存在就报错
    getattr(animal1,'sleep')
    
    #设置属性
    setattr(animal1,'meek',True)
    setattr(animal1,'have_fun',lambda self:print('%s is having fun'%self.name))
    print(animal1.__dict__)
    animal1.have_fun(animal1)
    
    #删除属性
    delattr(animal1,'meek')
    delattr(animal1,'have_fun')
    #删除属性,不存在则报错
    #delattr(animal1,'have_fun1')
    print(animal1.__dict__)
    #类也是对象
    class Animal(object):
        staticField = 'live'
    
        def __init__(self):
            self.name = 'cat'
    
        def eat(self):
            return 'eat'
    
        @staticmethod
        def bar():
            return 'bar'
    
    print(getattr(Animal,'staticField'))
    print(getattr(Animal,'eat'))
    print(getattr(Animal,'bar'))
    类也是对象
    import sys
    
    def s1():
        print('打印s1')
    
    func_name = s1.__name__
    this_module = sys.modules[__name__]   #python中所有加载到内存的模块都放在sys.modules
    print(hasattr(this_module,'s1'))
    res = getattr(this_module,'s1')  #根据函数名获得函数对象
    res()
    反射当前模块成员 

      导入其他模块,利用反射查找该模块是否具有该方法   

    def my_test():
        print('module_test')
    module_test.py
    import module_test as obj
    
    print(hasattr(obj,'my_test'))
    getattr(obj,'my_test')()

    动态导入模块

     在程序运行的过程中,根据变量或者配置动态的决定导入哪个模块

     目录如图

    def my_test():
        print('my_test import success')
    metaclass.py
    #moduleImport_test.py
    
    import importlib
    
    res = importlib.import_module('import_lib.metaclass')
    res.my_test()
  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    数论12——浅谈指数与对数
    数论11——大组合数
  • 原文地址:https://www.cnblogs.com/iamluoli/p/9228280.html
Copyright © 2020-2023  润新知