美文网首页
自省,反射

自省,反射

作者: 夜醉梦紅尘 | 来源:发表于2019-09-30 13:59 被阅读0次

    简单理解:
    自省相当于只读,反射相当于能读能写(改)

    自省

    自省常用到函数 dir()
    dir() 函数可能是 Python 自省机制中最著名的部分了。
    它返回传递给它的任何对象的属性,方法等,并且生成一个列表, 并且这个列表是经过排序的。
    如果不指定对象,则 dir()返回当前作用域中的名称。

    dir() 函数适用于所有对象类型,包括字符串、整数、列表、元组、字典、函数、定制类、类实例和类方法。
    可以试用以下代码来了解

    dir(18)
    
    dir('shark')
    
    dir([])
    
    dir(())
    
    dir({})
    
    dir(id)
    

    dir 作用于类和实例对象

    lass Person:
           city='bj'
           def __init__(self,name,age):
                self.name = name
                self.age = age
           def foo(self):
                 return f"{self.name}"
    obj=Person('shark',18)
    print(dir(obj))
    obj.hobby = 'money'    
     #dir()返回传递给它的任何对象的属性名称列表, 并且这个列表是经过排序的。
     print(dir(obj))     
    

    反射

    计算机科学中,反射是指计算机程序运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 ---- 摘自维基百科

    要注意术语“反射”和“内省”(type introspection)的关系。内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测;反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构。 ---- 摘自维基百科

    Python 拥有反射机制。

    简单的来说,就是利用字符串的形式操作 对象 的相关属性或方法。

    Python 拥有反射机制, 就是可以使用字符串操作对象的属性。

    这个对象包括:

    类对象
    类的实例对象
    模块
    在 Python 中就有下面一组内置的函数来实现反射。

    hasattr()  判断一个对象中是否有某个属性
    
    getattr()  获取一个对象中的已有的某个属性
    
    setattr()  添加某个属性给一个对象
    
    delattr()  删除一个对象已有的某个属性
    

    上面几个函数的语法:

    hasattr(对象, "对象的属性名称")
    注意 对象的属性名称 是字符串

    代码实例

    class Person:
           city='bj'
           def __init__(self,name,age):
                self.name = name
                self.age = age
           def foo(self):
                 return f"{self.name}"
    obj=Person('shark',18)
     print(hasattr(Person,'city'))
     print(getattr(Person,'city'))   
     f=getattr(obj,'foo')     获取对象的函数并且调用他
     print(f())
     setattr(obj,'name','xiguatian')      替对象改属性
     print(getattr(obj,'name'))
     delattr(obj,'name')                     将对象的属性删除
     print(getattr(obj,'name','no'))      如果获取不到相应的值会报错,所以加 
                                                          一个默认值 'no'
    setattr(obj,'name','wgy')         添加属性并且赋值
    print(obj.foo())
    print(getattr(obj,'age','name'))   getatter取不到两个值
    
    

    相关文章

      网友评论

          本文标题:自省,反射

          本文链接:https://www.haomeiwen.com/subject/pnakyctx.html