• python 反射


    反射

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

    这在一些只能拿到字符串类型名字的情况下就极为好用了

    反射对象的属性      (用到的关键字:getattr)

    class A:     #先创建一个类
        price = 25
        def func(self):    #定义一个方法
            print('卖橘子啦')
    a = A()             #实例化一个对象
    a.name = 'sakura'  #给对象添加一个属性 名字=樱花
    print(getattr(a,'name'))  #getattr(对象,'属性名')  这个属性名一定是字符串形式

    sakura  

    反射对象的方法

    class A:     #先创建一个类
        price = 25
        def func(self):    #定义一个方法
            print('卖橘子啦')
    a = A()             #实例化一个对象
    a.name = 'sakura'  #给对象添加一个属性 名字=樱花
    getattr(a,'func')()  #getattr(对象,'方法名')

    卖橘子啦

    反射类的属性

    class A:     #先创建一个类
        price = 25
        def func(self):    #定义一个方法
            print('卖橘子啦')
    a = A()             #实例化一个对象
    a.name = 'sakura'  #给对象添加一个属性 名字=樱花
    print(getattr(A,'price'))  # getattr(类,'属性名')

    25

    反射类的方法

    class A:     #先创建一个类
        price = 25
        def func(self):    #定义一个方法
            print('卖橘子啦')
    a = A()             #实例化一个对象
    a.name = 'sakura'  #给对象添加一个属性 名字=樱花
    ret = getattr(A,'func') #getattr(类,'方法名')   这样得到的是一个方法的内存地址记得调用
    ret(a)                #调用一个方法一定要给它传个参数
    getattr(A,'func')(a) #这个是上面那个的简写形式

    卖橘子啦
    卖橘子啦

    如果调用类中没有的属性或方法,程序报错怎么办

    这时候就要用到一个和getattr配套使用的 hasattr

    class A:     #先创建一个类
        price = 25
        def func(self):    #定义一个方法
            print('卖橘子啦')
    a = A()             #实例化一个对象
    a.name = 'sakura'  #给对象添加一个属性 名字=樱花
    if hasattr(A,'funs'): # 作用就是判断类中有没有这个方法 如果有就执行下一步
        getattr(A,'funs')(a) #这个是上面那个的简写形式

    可以看见 程序并没有报错 也就是没有执行funs方法

    除此之外,还能反射模块中的方法和属性

    反射自己模块中的变量和函数

    def funs():  #写一个简单的函数
        print('你站在这里不要走动,我去给你把橘子树搬来')

    现在 有了一个函数,那该怎么调用它呢

    import sys        #使用sys模块
    def funs():  #写一个简单的函数
        print('你站在这里不要走动,我去给你把橘子树搬来')
    year = 8102
    print(sys.modules['__main__'])   #这样就能调用自己的模块了 (在内存中自己写的没有使用的模块都叫__main__)
    # 现在知道自己写的函数就是sys.modules['__main__']
    print(getattr(sys.modules['__main__'],'year'))

    打印出来第一个是:一个函数的内存地址

    第二个是:8102

    import sys        #使用sys模块
    def funs():  #写一个简单的函数
        print('你站在这里不要走动,我去给你把橘子树搬来')
    year = 8102
    getattr(sys.modules['__main__'],'funs')()  #这样就可以调用这个函数了
    getattr(sys.modules[__name__],'funs')()     # 有些情况下 函数名字也会改变之类的, 所以把它设成变量更好

    你站在这里不要走动,我去给你把橘子树搬来
    你站在这里不要走动,我去给你把橘子树搬来

    设置修改变量

    class Circle: #创建一个类
        pass
    a = Circle()   #实例化一个对象
    a.name = 'sakura'  #给这个对象一个属性 名字=樱花
    print(a.name)
    setattr(a,'name','dark')  #用setattr修改name的值
    print(a.name)

    sakura
    dark

    可以看见name的值被修改了

    删除一个变量

    class Circle:
        print('这个是橘子树')
    a = Circle()

    这个是橘子树

    现在有一个类和一个对象

    class Circle:
        print('这个是橘子树')
    a = Circle()
    delattr(Circle,'a') #delattr(类或对象,'属性名')

    这样就把类中的a对象删除了

  • 相关阅读:
    java SE :文件基本处理 File、FileFilter、FileNameFilter
    java SE :标准输入/输出
    java EE :GenericServlet 抽象类、ServletConfig 接口
    java EE :Servlet 接口
    java EE : http 协议响应头部信息验证
    java EE : http 协议之请求报文、响应报文
    java EE : tomacat 基础
    06 java 基础:java 循环 递归
    05 java 基础:运算符、程序结构
    04 java 基础:数据类型
  • 原文地址:https://www.cnblogs.com/GrandDarkness/p/8329884.html
Copyright © 2020-2023  润新知