Loading

面向对象之反射

反射介绍

什么是反射

反射指的是程序可以访问、检查和修改它本身的状态的行为的一种能力(自省)。

在python中的反射是指:通过字符串的形式操作对象相关属性,就是通过字符串让对象自省自检是否有字符串表示的属性。

Python中反射机制的实现

1. 先通过dir()方法: 查看某一个对象下可以.出哪些属性

print(dir(obj))

2. 然后可以使用__dict__方法通过字符串反射到真正的属性上, 得到属性值

print(obj.__dict__['name'])

在Python中哪些对象可以使用反射机制

  • python中一切都是对象,所以都可以使用反射来进行自省
  • 类可以对类的共有属性,方法(绑定方法,非绑定方法)进行反射
  • 当前模块也可以进行反射。如:判定导入的模块是否有某个方法,有的化就进行调用。

 

反射机制中的四大内置函数

hasattr()

hasattr(obj, 'string') 让obj自省自检有没有和string名符合的属性,有返回True,没有返回False。

print(hasattr(obj, 'name'))  # True

getattr()

getattr(obj, 'string', None) 返回obj和string名相同的绑定方法。可以用来让一个变量引用这个返回结果,后面就可以使用这个变量, 相当于使用对象的绑定方法, 如果没有, 返回None, 没有第三个参数则抛出异常

print(getattr(obj, 'name'))  # print(obj.__dict__['name'])

setattr()

setattr(obj, 'string', val) obj设置一个和string同名的的属性,并赋值为val。

setattr(obj, 'name', 'zhangjie')  # obj.__dict__['name'] = 'zhangjie'

print(obj.name)

delattr()

delattr(obj, 'string') 删除obj对象的‘string’的同名的属性。

delattr(obj, 'name')  # del obj.__dict__['name']

print(obj.__dict__)

 

反射的案例

class Ftp(object):

    def get(self):
        print('正在执行下载功能')

    def interactive(self):
        method = input('>>>:').strip()  # method = 'get'

        if hasattr(self, method):
            getattr(self, method)()
        else:
            print('输入的指令不存在')


result = Ftp()
result.interactive()

 

posted @ 2020-07-18 17:35  愚者丶  阅读(271)  评论(0编辑  收藏  举报