# 使用反射获取到的函数和方法可以像平常一样加上括号直接调用,获取到类后可以直接构造实例;
# 不过获取到的字段不能直接赋值,因为拿到的其实是另一个指向同一个地方的引用,赋值只能改变当
# 前的这个引用而已。
# 一.访问对象的属性 class Person(): def __init__(self): self.name = ‘Mic‘ self.age = 18 def run(): print(‘run----‘) obj = Person() print(dir(obj)) if hasattr(obj, ‘name‘): setattr(obj, ‘name‘, ‘Merry‘) print(getattr(obj, ‘name‘)) # 1.dir(obj) 返回包含obj大多数属性名的列表 # 2.hasattr(obj, attr) 判断对象是否含有指定属性 # 3.getattr(obj, attr) 获取对象指定属性的值 # 4.setattr(obj, attr, value) 设置对象指定属性的值 # 二.访问对象的元数据 # dir()方法返回的属性中包含一些不是自己定义的元数据; # types模块定义了全部python内置类型; # isinstance()函数也可以检查对象是否指定的数据类型; # 1.反射模块的元数据 import re print(re.__doc__) # 文档字符串 print(re.__name__) # 字符串形式的模块名 print(re.__file__) # print(re.__dict__) # 将对象的属性名及属性,以字典的形式返回; # 在python3中,字典的items()方法返回的是一个内置__iter__()方法的类, # 所以,就是一个可迭代对象,可以for循环遍历,但是不能通过下标来取; # 在python2中,字典的items()方法返回的是[(,), (,), (,)]类型数据; # 2.反射类的元数据 print(Person.__doc__) # 文档字符串 print(Person.__name__) # 定义时的类名 print(Person.__module__) # 字符串形式的模块名 print(Person.__bases__) # 第一层父类的元组 print(Person.__dict__) # 属性名-属性字典 # 3.反射实例的元数据 print(obj.__dict__) # 属性名-属性字典 print(obj.__class__) # 该实例的类对象 print(obj.__class__==Person) # True # 4.反射内建函数和方法的元数据 # python的内建函数是c写的模块,可以sys模块的builtin_module_names字段 # 查看所有内建模块 print(max.__doc__.splitlines()[0]) # 函数文档 print(max.__name__) # 函数定义时的名字 print(max.__self__) # 指向该方法的类 print(max.__module__) # 函数所在模块名 # ...略 # inspect模块提供了一系列函数帮助反射查询;