zoukankan      html  css  js  c++  java
  • 反射

    python是动态语言,而反射(reflection)机制被视为动态语言的关键。

    反射机制指的是在程序的运行状态中

    对于任意一个类,都可以知道这个类的所有属性和方法;

    对于任意一个对象,都能够调用他的任意方法和属性。

    这种动态获取程序信息以及动态调用对象的功能称为反射机制。

    在python中实现反射非常简单,在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式

    class People:
         def __init__(self,name,age,gender):
             self.name=name
             self.age=age
             self.gender=gender
     
    obj=People('egon',18,'male')
    dir(obj) # 列表中查看到的属性全为字符串
    [......,'age', 'gender', 'name']

    接下来就是想办法通过字符串来操作对象的属性了,这就涉及到内置函数hasattr、getattr、setattr、delattr的使用了(Python中一切皆对象,类和对象都可以被这四个函数操作,用法一样)

    class Teacher:
        def __init__(self,full_name):
            self.full_name =full_name
    
    t=Teacher('Egon Lin')
    
    # hasattr(object,'name')
    hasattr(t,'full_name') # 按字符串'full_name'判断有无属性t.full_name
    
    # getattr(object, 'name', default=None)
    getattr(t,'full_name',None) # 等同于t.full_name,不存在该属性则返回默认值None
    
    # setattr(x, 'y', v)
    setattr(t,'age',18) # 等同于t.age=18
    
    # delattr(x, 'y')
    delattr(t,'age') # 等同于del t.age

    基于反射可以十分灵活地操作对象的属性,比如将用户交互的结果反射到具体的功能执行

    >>> class FtpServer:
    ...     def serve_forever(self):
    ...         while True:
    ...             inp=input('input your cmd>>: ').strip()
    ...             cmd,file=inp.split()
    ...             if hasattr(self,cmd): # 根据用户输入的cmd,判断对象self有无对应的方法属性
    ...                 func=getattr(self,cmd) # 根据字符串cmd,获取对象self对应的方法属性
    ...                 func(file)
    ...     def get(self,file):
    ...         print('Downloading %s...' %file)
    ...     def put(self,file):
    ...         print('Uploading %s...' %file)
    ... 
    >>> server=FtpServer()
    >>> server.serve_forever()
    input your cmd>>: get a.txt
    Downloading a.txt...
    input your cmd>>: put a.txt
    Uploading a.txt...
  • 相关阅读:
    (转)一个JavaWeb项目开发总结
    (转)JAVA之桥接模式
    (转)Singleton 单例模式(懒汉方式和饿汉方式)
    (备忘)android模拟器摄像头模拟
    (原创)android中使用相机的两种方式
    (转)android中颜色矩阵colormatrix
    android中paint的setXfermode属性
    【贾志豪NOIP模拟题】慰问员工 cheer 【最小生成树】【对边权值的一些处理】
    【洛谷1340】兽径管理(最小生成树 Kruskal)(sort的一些技巧)【2012福建省信息学奥林匹克CCF NOIP夏令营第05天训练】
    【CSP2019】【洛谷5657】格雷码
  • 原文地址:https://www.cnblogs.com/ZhZhang12138/p/14887275.html
Copyright © 2011-2022 走看看