1.什么是反射
现有一个字符串,你希望能够将这个字符串转成变量名,这个变量名可以是(类名函数名变量名方法名对象名),
反射: 某个命名空间中的某个"变量名",获取这个变量名对应的值
class Manager:pass class Student:pass class Teacher:pass identify = 'Student' print(eval(identify)()) #这样就可以执行实例化了,但是eval不安全
反射类中的属性
class Person: role = '人类' country = '中国' attr = input('>>>') if hasattr(Person,attr): #输入正确返回Ture,输入错误返回Fasle print(getattr(Person,attr)) #(类名,值)
反射类中的方法
class Person: role = '人类' @staticmethod def show_courses(): print('所有课程') ret = getattr(Person,'show_courses') print(ret) ret(
a.b 类型
类名.静态属性/类名.类方法/类名.静态方法
list
对象.对象属性/对象.普通方法/对象.类方法/对象.静态方法
调用属性和方法
class A: def __init__(self,name): self.name = name def eat(self): print('%s is eating'%self.name) wl = A('wanglna') if hasattr(wl,'name'): print(getattr(wl,'name')) if hasattr(wl,'eat'): getattr(wl,'eat')()
通过类名反射
getattr(类名,'静态属性') getattr(类名,'类方法')() getattr(类名,'静态方法')
通过对象名反射
getattr(对象名,'对象属性') getattr(对象名,'普通方法')() getattr(对象名,'类方法')() getattr(对象名,'静态方法')()
通过模块反射
getattr(模块,'全局变量') getattr(模块,'函数名')
反射全局变量的值(反射本文件中的名字)
from sys import modules a = 1 b = 2 lst = [1,2,3] class Manager:pass class Student:pass class Teacher:pass getattr(modules[__name__],'Student') identify = input('>>>').strip() # 类 = getattr(modules[__name__],identify) # print(类) # 对象 = 类() # print(对象)