zoukankan      html  css  js  c++  java
  • 面向对象_反射

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

      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()
  • 相关阅读:
    work_27_一次springBoot+orcal+Mabits PageHele的使用
    work_26_swagger2整合springBoot和使用
    work_25_docker--RabbitMq消息队列
    work_24_MYSQL从create table... 到分库分表
    work_23_常用的工具类
    work_22_MySQL分库分表的初识
    work_21_AtomicInteger API
    work_20_stream的使用
    MySQL 基础语句的练习2
    MySQL 基础语句的练习
  • 原文地址:https://www.cnblogs.com/iamluoli/p/9228280.html
Copyright © 2011-2022 走看看