一:反射
class Student():
school = 'sh'
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('from func')
stu = Student('ly', 18)
1.对象内使用
正常获取值
print(stu.name)
用字符串取值 报错
print(stu."name")
通过字符串获取属性
print(stu.__dict__['name']) # 如果对象不存在直接报错
1.getattr
getattr(stu, 'name') # 等价于 stu.name
通过字符串获取对象里面的属性 正常取值
print(getattr(stu, 'name')) # 正常取值 :ly
2.getattr
通过字符串获取属性 如果没有该属性 不会报错 给个默认值 会返回None 不会报错
print(getattr(stu, 'name', None))
取类中方法
正常取值
stu.func() # 结果:from func
3.getattr
通过字符串取方法
getattr(stu, 'func')() # 结果:from func
增加属性 字符串操作
4.setattr
新增值 变量名 变量值
setattr(stu, 'x', 123)
查看内存地址
print(stu.__dict__) # 结果:{'name': 'ly', 'age': 18, 'x': 123}
5.hasattr 查看该属性是否存在
在返回 True 不在返回False
print(hasattr(stu, 'name'))
6.delattr 删除属性
delattr(stu, 'name')
print(stu.__dict__) # 结果:{'age': 18}
2.类使用
1.获取类属性getattr
print(getattr(Student, 'school')) # 结果:sh
模块
正常使用time模块
import time
time.sleep(1)
getattr实现
getattr(time, 'sleep')(2)
底层原理
__import__('time') # import time
底层原理
time = __import__('time')
time.sleep(3)
![image](https://img2020.cnblogs.com/blog/2608805/202112/2608805-20211207224547448-2063417704.webp)