python动态导包和类反射

python动态导包和类反射

    • 类反射
    • 获取属性的值
      • 调用属性或方法
    • 动态导包
      • 类中找方法

类反射

类反射参考: https://www.cnblogs.com/cenyu/p/5713686.html

# 修改对象的属性的值
setattr(obj,属性,)
# 示例
setattr(对象,"name","张三")

获取属性的值

hasattr(obj,属性)
# 示例
hasattr(对象,"name")

# 如果没有这个属性,返回第三个值
hasattr(obj,属性,没有属性时返回的值)

# 判断有这个属性,就修改属性的值
if hasattr(obj,属性):
  setattr(obj,属性,修改属性值)

调用属性或方法

getattr(obj,方法,属性)
#调用属性
getattr(obj,属性)
# 调用方法,后面要加()
getattr(obj,方法)()

if hasattr(a.b)

  • 先判断a对象有没用有b属性或方法

getattr(a,b,c)

  • 如果a对象没用b属性,返回默认值c

动态导包

只能导入包,也就是只能导入模块
需要提前导入 sys模块 import sys

  • 动态导包: __import__('str格式要导入的模块名')
    • 需要的时候就导入,不需要的时候就不导入
import sys
#`__import__('str格式要导入的模块名')`,只能导入包,也就是只能导入模块
__import__('python_based.dir1.f3') #动态导包
module=sys.modules['python_based.dir1.f3'] #将导入的模块加载到内存
print(module)  #打印该模块的路径

类中找方法

类反射的两个方法

  • hasattr(m,o) # 在指定的模块m中查找指定的对象o是否存在,存在返回True,否则返回False
# hasattr 用来判断模块里有没有需要的对象
# 示例代码,接上面的动态导包
print(hasattr(module,'F1')) # 查看module模块中是否存在F1对象.
  • getattr(m,o) # 在指定的模块m中返回指定的对象o
# getattr 用来返回指定模块里的类对象
f = getattr(module,'F1') # new一个f对象
f().f2()  # 通过f对象调用f2()方法

示例代码

import sys

class TestClassReflection:
    def attr_a(self):
        print("A属性")

    def att_b(self):
        print("B属性")

    def test_func(self):
        print("function")

if __name__ == '__main__':
    # 如果attr_ac 类对象存在,就调用attr_a,如果不存在,就调用attr_b
    if hasattr(TestClassReflection, "attr_ac"):
        print("att_ac存在,可以使用")
        getattr(TestClassReflection(), "attr_a")()
    else:
        getattr(TestClassReflection(), "att_b")()

    # 模块中找类,动态装载
    __import__("pylern.classReflection")  # 动态装载包里的模块
    # !!!!!注意这里是方括号
    module = sys.modules["pylern.classReflection"]  # 相当于导入模块
    if hasattr(module, "TestClassReflection"):  # 如果模块里有这个类,打印OK
        print("OK")
    class_name = getattr(module, "TestClassReflection")  # 用变量接收类
    print(class_name)
    if hasattr(class_name, "attr_a"):  # 在这个类里找方法,如果存在就执行这个方法
        print("2OK")
    getattr(class_name(), "attr_a")()

你可能感兴趣的:(Python3,python,开发语言,动态导包,类反射)