反射
class Teacher: dic = { '查看学生信息': '', '查看讲师信息': '' } @staticmethod def show_student(): print('show_student') @staticmethod def show_teacher(): print('show_teacher') @classmethod def func(cls): print('aaa') if hasattr(Teacher, 'dic'): ret = getattr(Teacher, 'dic') print(ret) ret2 = getattr(Teacher, 'func') ret2()


1、反射对象里的属性
class A: name = 'wang' a = A()
a.age = 11
# 通过变量名的字符串形式来获取它的值
# 以前只能通过 . 的方式来获取它的值 ret = getattr(a, 'age') print(ret)
反射的最常用场景:
class A: name = 'wang' a = A()
# 我们指定变量 attr = input('你想获取哪个变量的值: ')
# 根据变量获取它的值 ret = getattr(a, attr) print(ret)
2、反射对象里的方法
class A: def func(self): print(self.__dict__) a = A() ret = getattr(a, 'func') # 方法的字符串名字 print(ret) # ret是func的内存地址 ret() # 调用该方法
<bound method A.func of <__main__.A object at 0x033C0FB0>>
{}
3、反射类的属性
class A: name = 'wang' a = A() # 通过变量名的字符串形式来获取它的值 # 以前只能通过 . 的方式来获取它的值 ret = getattr(a, 'name') print(ret)

4、反射类的方法,包括静态方法和类方法
class A: @classmethod def func1(cls): print('A classmethod') @staticmethod def func2(): print('A staticmethod') if hasattr(A, 'func1'): ret = getattr(A, 'func1') ret() if hasattr(A, 'func2'): ret = getattr(A, 'func2') ret()
5、反射模块的属性和方法(内置模块和自定义模块和第三方模块)
这是模块test1的代码:
day = 11 def test(): print('这是test1模块中的方法test')
在其他地方引用该模块:
import test1 if hasattr(test1, 'day'): ret = getattr(test1, 'day') print(ret) if hasattr(test1, 'test'): ret = getattr(test1, 'test') ret()
6、反射自己模块中的属性和方法
import sys year = 2019 def self_test(): print('self test') ret1 = getattr(sys.modules['__main__'], 'year') print(ret1) ret2 = getattr(sys.modules['__main__'], 'self_test') ret2() print(sys.modules) # 打印加载的所有模块
# __main__代表当前模块,也就是我们所在的文件
以下是更好的写法:
import sys year = 2019 def self_test(): print('self test') ret1 = getattr(sys.modules[__name__], 'year') print(ret1) ret2 = getattr(sys.modules[__name__], 'self_test') ret2() print(sys.modules)


反射能反射到一切对象,只要它存在,就能反射到。因为反射的本质是找对象的内存地址。
7、设置属性和删除属性

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号