31.反射(getattr)

反射:

反射获取类中变量和方法:

用字符串类型的名字去获取变量,经常用来操作内存中已经存在的变量

class Teacher:
    dic={'学生':'','教师':''}
    @classmethod
    def show_info(cls):
        print('show_info')
ret=getattr(Teacher,'dic')  #通过变量名的字符串形式取到返回值
print(ret)
fun=getattr(Teacher,'show_info')   #指定的是一个方法,返回一个地址
fun()    #加上()调用该方法
t=Teacher()
print(getattr(t,'dic'))

执行结果:

{'学生': '', '教师': ''}
show_info
{'学生': '', '教师': ''}

从代码可以看出,getattr可以返回指定的对象或类的属性,没有的话报错,可以添加第3个参数,设置没有相应的属性时的返回值;如果寻找的是一个方法,即第二个参数是一个方法名,就返回一个地址,名字后面加上()就可以调用了

hasattr可以判断指定的对象或类是否由某个属性,有就返回True,没有返回False

setattr设置一个变量,setattr(A,'属性名','属性值')   给类A设置一个属性=属性值

  如 setattr(a,'属性名','属性值')   给对象a设置一个属性=属性值

delattr删除一个变量   delattr(a,'属性名')  将对象a的指定属性删除

  如 delattr(A,'属性名')   将对类A的指定属性删除

hasattr经常与getattr两个配合使用

class Teacher:
    dic={'学生':'show_stu_info','教师':'show_tea_info'}
    def show_stu_info(cls):
        print('返回学生个人信息')
    def show_tea_info(cls):
        print('返回教师个人信息')
alex=Teacher()
for i in Teacher.dic:
    print(i)
c=input('输入想要查看谁的信息:')
func=getattr(alex,Teacher.dic[c])  ###根据用户输入返回的字典值来查找函数
func()

getattr的使用场所,可以根据用户的输入,返回字典的值,这个值是一个字符串类型的函数名,使用getattr来查找该方法,允许返回的方法地址。

反射获取导入的模块中的属性和方法:

以反射的形式来获取导入的模块中的属性和方法,用法是相同的   操作方法:getattr(模块名,'属性名或函数名')

如,反射导入模块中的day变量

import my
print(getattr(my,'day'))

反射获取自己文件中的属性和方法:

反射自己文件中的变量和属性(非面向对象代吗)   操作方法:getattr(sys.modules[__name__],'属性名或方法名')

import sys
# sys.modules[__name__]    此段代码可以找到__main__,即使是被引入到别的函数中使用
def hello():
    print("你好")
getattr(sys.modules[__name__],'hello')()   #反射自己文件中的函数hello

反射的方法有参数:

在以上的反射中,反射的方法都是没有参数的,因此碰到带有参数的方法,反射方法如下:

 将参数写在正常代码后即可

import time
c=getattr(time,'strftime')('%Y-%m-%d %H:%M:S')  #反射函数打印时间,可间参数字节写在反射后的()中
print(c)

执行结果:

2020-10-24 21:25:17

反射一个模块中的类:

getattr(模块名,'类名')   #得到一个模块中的类

a=getattr(模块名,'类名')()  #得到一个模块中的类,并将该类实例化

 

posted @ 2020-10-24 21:27  maday  阅读(126)  评论(0)    收藏  举报