反射
反射:某个命名空间中的某个"变量名",获取这个变量名对应的值
getattr(命名空间,'key') == 命名空间.key
所有的a.b都可以被反射成getattr(a,'b')
class Person:
role = '人类'
Country = '中国'
attr = input('>>>')
if hasattr(Person,attr):
print(getattr(Person,attr))
反射类中的方法
class Person:
role = '人类'
@staticmethod
def show_courses():
print('所有课程')
Person.role == getattr(Person,'role')
Person.show_courses() == getattr(Person,'show_courses')()
ret = getattr(Person,'show_courses')
ret()
类\对象\模块 实际上都是有自己的命名空间,从这个命名空间中获取某个值或者函数...名字
如果这个名字字符串数据类型
值 = 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(对象)
class A:
def __init__(self,name,age):
self.name = name
self.age = age
a = A('alex',83)
# hasattr
# print(getattr(a,'name'))
# a.sex = '不详' # setattr(a,'sex','不详')
# print(a.sex)
# del a.age # delattr(a,'age')
print(a.__dict__)