面向对象_反射

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

  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()
原文地址:https://www.cnblogs.com/iamluoli/p/9228280.html