zoukankan      html  css  js  c++  java
  • 面向对象之反射

    反射介绍

    什么是反射

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

    在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()
  • 相关阅读:
    HDU_2191_多重背包
    HDU_1494_dp
    POJ_1088_dfs
    所有的畅通工程[HDU1232][HDU1874][HDU1875][HDU1879]
    畅通工程[HDU1863]
    还是畅通工程[HDU1233]
    最小生成树
    Who's in the Middle[HDU1157]
    Bungee Jumping[HDU1155]
    Is It A Tree?[HDU1325][PKU1308]
  • 原文地址:https://www.cnblogs.com/featherwit/p/13336609.html
Copyright © 2011-2022 走看看