zoukankan      html  css  js  c++  java
  • 025_反射

    1,isinstance和issubclass

      isinstance(obj,cls)检查是否obj是否是类 cls 的对象

    class Foo(object):
         pass
      
    obj = Foo()
      
    isinstance(obj, Foo)
    

      issubclass(sub, super)检查sub类是否是 super 类的派生类 

    class Foo(object):
        pass
     
    class Bar(Foo):
        pass
     
    issubclass(Bar, Foo)
    

    2,反射 

      2.1, 什么是反射

        反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

        python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

        反射 : 是用字符串类型的名字 去操作 变量

      2.2,四个实现反射的函数

    def hasattr(*args, **kwargs): # real signature unknown
        """
        Return whether the object has an attribute with the given name.
        
        This is done by calling getattr(obj, name) and catching AttributeError.
        """
        pass
    hasattr
    def getattr(object, name, default=None): # known special case of getattr
        """
        getattr(object, name[, default]) -> value
        
        Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
        When a default argument is given, it is returned when the attribute doesn't
        exist; without it, an exception is raised in that case.
        """
        pass
    getattr
    def setattr(x, y, v): # real signature unknown; restored from __doc__
        """
        Sets the named attribute on the given object to the specified value.
        
        setattr(x, 'y', v) is equivalent to ``x.y = v''
        """
        pass
    setattr
    def delattr(x, y): # real signature unknown; restored from __doc__
        """
        Deletes the named attribute from the given object.
        
        delattr(x, 'y') is equivalent to ``del x.y''
        """
        pass
    delattr
    class Foo:
        f = '类的静态变量'
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def say_hi(self):
            print('hi,%s'%self.name)
    
    obj=Foo('egon',73)
    
    #检测是否含有某属性
    print(hasattr(obj,'name'))
    print(hasattr(obj,'say_hi'))
    
    #获取属性
    n=getattr(obj,'name')
    print(n)
    func=getattr(obj,'say_hi')
    func()
    
    print(getattr(obj,'aaaaaaaa','不存在啊')) #报错
    
    #设置属性
    setattr(obj,'sb',True)
    setattr(obj,'show_name',lambda self:self.name+'sb')
    print(obj.__dict__)
    print(obj.show_name(obj))
    
    #删除属性
    delattr(obj,'age')
    delattr(obj,'show_name')
    delattr(obj,'show_name111')#不存在,则报错
    
    print(obj.__dict__)
    四个方法的使用演示
    class Foo(object):
     
        staticField = "old boy"
     
        def __init__(self):
            self.name = 'wupeiqi'
     
        def func(self):
            return 'func'
     
        @staticmethod
        def bar():
            return 'bar'
     
    print getattr(Foo, 'staticField')
    print getattr(Foo, 'func')
    print getattr(Foo, 'bar')
    类也是对象

    3,getatter   使用反射的模块

      3.1,反射对象中的属性和方法

    class A:
        def func(self):
            print('in func')
    
    a = A()
    a.name = 'alex'
    a.age = 63
    
    
    # 反射对象的属性
    ret = getattr(a,'name')  # 通过变量名的字符串形式取到的值
    
    # 反射对象的方法
    ret = getattr(a,'func')  #反射对象的方法拿到的是方法的地址
    ret()

      3.2,反射模块的属性

    # 内置模块也能用
    # time模块中的 time asctime
    
    # import time    #先导入,然后可以用字符调用
    # print(getattr(time,'time')())
    # print(getattr(time,'asctime')())
    

      3.3,反射自己的模块

    # 自己的模块
    def qqxing():
        print('qqxing')
    
    year = 2018
    
    # 反射自己模块中的变量
    import sys
    print(sys.modules['__main__'].year)
    # sys.modules['__main__'] 是本模块的意思
    
    # 反射自己模块中的函数
    getattr(sys.modules['__main__'],'qqxing')()
    #反射函数拿到的是函数的地址,要加括号才能执行。

      3.4,要反射的函数有参数怎么办?

    # 直接在后面括号中正常传参就可以了
    import time
    print(time.strftime('%Y-%m-%d %H:%M:S'))
    print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))

    4,hassattr    查看当中有没有这个方法或变量,有就返回True 

    if hasattr(my,'name'):
      getattr(my,'name')
    

    5,setattr  设置修改变量

    class A:
        pass
    a = A()
    
    setattr(A,'name','alex')  #在A类里设置了一个属性,并赋值。
    print(A.name)
    setattr(a,'name','nezha')  #在a对象中设置了一个属性,并赋值。
    print(a.name)
    

    6,delattr 删除一个变量 

    delattr(a,'name')  #删除a对象中的name属性
    print(a.name)     #对象中的没有了,就去类里调用
    

     

  • 相关阅读:
    c语言通过89C51驱动1602液晶显示(入门级别)
    Top k问题的讨论(三种方法的java实现及适用范围)
    单链表是否有环的问题解决与讨论(java实现)
    有效二叉查找树判断(java实现)
    字典序全排列(java实现)
    Java LRU的实现
    Windows 系统中目录 (Directory) 与文件夹 (Folder) 的区别
    Linux 版 SecureCRT 界面变为 Windows 2000 风格的解决办法
    也谈如何获取真实正确的 Windows 系统版本号
    64 位 Windows 平台开发要点之文件系统重定向
  • 原文地址:https://www.cnblogs.com/eternity-twinkle/p/10608058.html
Copyright © 2011-2022 走看看