反射,主要指程序可以访问、检测和修改它本身状态或者行为的一种能力(自省)
可以通过字符串的形式来操作对象的属性
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
p = Person("jack",12)
想判断类中是否有某个属性p.name直接调用了没有的话报错,所以这种方法无法判断。需要用字符串形式来操作对象的属性
if hasattr(p,"name2") #hasatter方法是反射的一个方法,判断类中是否有这个属性,返回布尔值。第一个参数是实例,第二个参数是加了引号的属性名称
print("123456") #如果存在打印123456 ,不存在不打印
共有四个方法:
hasattr():判断
getattr():获取
setattr():赋值
delattr():删除
class Person:
def run(self):
print("running on the road and seeing the pretty girl!")
user_command = input(>>:).strip( )
if hasattr(p,user_command):
func = getattr(p,user_command) #如果函数中有输入的函数名,执行的话就需要将函数赋值,要不然无法执行
func() #执行
setattr:
class Person:
def __init__(self,name):
self.name = name
p = Person("jack")
setattr(p,"age",12)
print(p.age) #只存在实例中,类中没有这个属性
添加方法(函数):
def walk(self): #将需添加的函数按着类中的函数格式写出
print(slef.name)
setattr(p,"func",walk) #第二个参数是赋进去的函数名,第三个参数是被赋进的函数名
p.func(p) #记得调用的时候需要将实例传入才行
类也是个对象,也可以添加
删除delattr:
delattr(p,"age")
动态加载模块:即不在最开始import加载模块,用的时候再加载
这个学的就是一个模块加载的方法,简单一行代码
import importlib
importlib.import_moudle("文件名")