反射

反射

一、getatter, hasatter, delatter

1、getatter

class Teacher:
    dic = {'查看学生信息':' ','查看老师信息':' '}
    def show_student(self):
        print('show_student')
    def show_teacher(self):
        print('show_teacher')
    @classmethod
    def func(cls):
        print('hahaha')

ret1 = getattr(Teacher,'dic')  # 获取类Teacher里面的属性dic,可等同于Teacher.dic 类也是对象
print(ret1)
ret2= getattr(Teacher,'func')  # 类.方法等同于Teacher.func
print(ret2)  # 打印的是地址
ret2()  # 地址加括号才是执行代码

运行结果:

{'查看老师信息': ' ', '查看学生信息': ' '}
<bound method Teacher.func of <class '__main__.Teacher'>>
hahaha

2、hasatter

  • getatter和hasatter属于夫妻党,先用hasatter判断是否存在,再用getatter获取对应的方法属性
class Teacher:
    dic = {'查看学生信息':' ','查看老师信息':' '}
    def show_student(self):
        print('show_student')
    def show_teacher(self):
        print('show_teacher')
    @classmethod
    def func(cls):
        print('hahaha')
if hasattr(Teacher,'dic4'):  # 判断是否在类Teacher中存在dic4,没有则不会执行以下代码,并且不会报错
    ret = getattr(Teacher,'dic4')
    print(ret)
if hasattr(Teacher,'dic'):  # 判断是否在类Teacher中存在dic,有则会执行以下代码
    ret1 = getattr(Teacher,'dic')  # 获取类Teacher里面的属性dic,可等同于Teacher.dic 类也是对象
    print(ret1)

运行结果:

{'查看学生信息': ' ', '查看老师信息': ' '}

for循环,用户交互与夫妻档的结合:

class Teacher:
    dic = {'查看学生信息':'show_student','查看老师信息':'show_teacher'}
    def show_student(self):
        print('show_student')
    def show_teacher(self):
        print('show_teacher')
    @classmethod
    def func(cls):
        print('hahaha')

alex = Teacher()  # 实例化
print(alex.show_student())  # 对象.方法函数
print(alex.show_teacher())  # 对象.方法函数
for k in Teacher.dic:
    print(k)  # 打印字典里面的key
key = input('输入需求:')  # 根据用户需求是要显示学生的还是老师的
print(Teacher.dic[key])  # 打印你的需求。也可以不直接打印而是通过下面的夫妻档来完成
if hasattr(alex,Teacher.dic[key]):  # 夫妻档判断用户输入的需求是否存在
    func = getattr(alex,Teacher.dic[key])
    func()

运行结果:

show_student
None
show_teacher
None
查看学生信息
查看老师信息
输入需求:查看学生信息
show_student
show_student

3、小结

通过反射可以学到:

  • 对象名可以获取对象属性和普通方法
  • 类名可以获取静态属性和类方法还有静态方法
  • 普通函数方法的参数:self
  • 静态方法:@staticmethod
  • 类方法:@classmethod
  • 属性方法:@property
原文地址:https://www.cnblogs.com/wxm422562/p/11094107.html