第55天python学习反射 动态导入模块

#反射应用场景:就是分开很多人开发不同模块,不知道是否调用的是否有对应方法,使用if判断一下

# 反射的概念:主要指程序可以访问,检测和修改它本身状态或是行为的一种能力(自省),
#四个可以实现自省的函数,下列方法适用于类和对象
# hasattr(object,"name")#判断object中有没有一个name字符串对应的方法和属性
class BlackMesium:
feture="heizhongjie"
def __init__(self,name,addr):
self.name=name
self.addr=addr

def sell_hourse(self):
print("【%s】正在卖房子,傻逼才买呢"%self.name)

def rent_hourse(self):
print("【%s】正在租房子,傻逼才组呢"%self.name)

p1=BlackMesium("万科翡翠","官渡")

# print(hasattr(p1,"name"))#使用hasattr来检测p1是否可以调用到name的属性,结果True
#
# print(hasattr(p1,"sell_hourse"))#结果True
#
# #使用getattr(object,name,default)获得对应属性值
# print(getattr(p1,"name"))#结果:万科翡翠。getattr实际就是p1.name的
#
# print(getattr(p1,"sell_hourse"))#获得地址:加括号运行结果<bound method BlackMesium.sell_hourse of <__main__.BlackMesium object at 0x02410190>>
#
# print(getattr(p1,"sell_hourse","没有这个属性"))#默认参数直接输出

#总结:getattr(p1,"name")就是p1.name

#setattr(obj, "age", 19) 动态的增加对象或者类中的成员
setattr(p1,"sb",True)#添加傻逼属性True
setattr(p1,"name","congming")#修改name属性为congming
print(p1.__dict__)#{'name': 'congming', 'addr': '官渡', 'sb': True}


#使用delattr动态的删除类或者方法成员
delattr(p1,"sb")
print(p1.__dict__)#{'name': 'congming', 'addr': '官渡'}


# 动态导入模块
# 动态导入模块方法1: __import__

# 1. 函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。
#
# 2. __import__(module)相当于import module


# 首先创建一个模块目录lib,然后在目录内创建一个模块为:aa.py
#
# 模块代码为:
#
# class c(object):
# def __str__(self):
# return 'C language'
# 在lib目录平级新建一个测试的模块,使用 __import__ 动态以字符串形式导入lib下的aa模块。
#
# lib = __import__('lib.aa') # 相当于import lib
# c = lib.aa.c()
# print(c)

# 动态导入模块方法2:import importlib
#
# 实例还是上面的lib.aa模块,这里使用importlib进行动态导入(这个方法好理解,也是官方建议使用的)
#
# import importlib
# aa = importlib.import_module('lib.aa')
# c = aa.c()
# print(c)