• 27反射、类的内置方法


    一、反射

    1、什么是反射?

      用字符串类型的名字去操作变量

    2、反射对象中的属性和方法

      getattrhasattrsetattrdelettr

    3、  getattr:通过字符串类型的名字取到变量的值

      hasattr:判断字符串类型的名字对应的值是否存在

      setattr :(建立)设置字符串类型的名字和值

      deleattr:删除字符串类型的变量

    getattr:

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

    hasattr(与getattr配合使用)

    class A:
        price=20
        @classmethod
        def func(self):
            print('in the func')
    if hasattr(A,'func'):                  #hasattr判断是否变量存在
        ret=getattr(A,'func')
        ret()

    反射模块中的属性和方法:

      可以反射模块(包括内置模块)的属性和方法,可以反射自己模块(其他模块)的函数和变量,还可以反射一个模块的类。

    #模块
    import my
    #反射模块的属性
    print(my.day)
    print(getattr(my,'day'))
    
    #反射模块的方法
    getattr(my,'wahaha')()
    
    #内置模块也能用
    time
    asctime
    import time
    print(getattr(time,'time')())
    print(getattr(time,'asctime')())
    
    def qqxing():
        print('qqxing')
    year = 2018
    import sys
    print(sys.modules['__main__'].year)
    # 反射自己模块中的变量
    print(getattr(sys.modules['__main__'],'year'))
    
    # 反射自己模块中的函数
    getattr(sys.modules['__main__'],'qqxing')()
    变量名 = input('>>>')
    print(getattr(sys.modules[__name__],变量名))
    
    #要反射的函数有参数怎么办?
    print(time.strftime('%Y-%m-%d %H:%M:S'))
    print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))
    
    #一个模块中的类能不能反射得到?
    import my
    print(getattr(my,'C')())
    if hasattr(my,'name'):
        getattr(my,'name')

    setattr:设置修改值

      

    class A:
        def func(self):
            pass
    a=A()
    setattr(a,'name','alex')
    print(getattr(a,'name'))

    delattr:删除一个变量

    # delattr 删除一个变量
    delattr(a,'name')
    print(a.name)
    delattr(A,'name')
    print(a.name)

     二、类的内置方法

      __str__ 、__repr__、__del__、__len__、__call__

    __str__:自己没有__str__方法的时候,就去父类object去调用,返回调用这个方法的对象的内存地址,如果自己定义了__str__方法,那么就执行自己的__str__方法,打印这个对                   象的时候,就会执行a.__str__方法(默认就执行了),(返回一些自己定义的方法)。

    class A:
        def __str__(self):
            return "A's object"
    a=A()
    print(a)

    __repr__:类似__str__方法,就是调用repr执行的内置方法,%r,print(repr)也是执行的它(不知道它有什么用)

    __del__:析构函数,删除一个对象之前进行一些收尾工作

    __call__:执行函数的时候自动执行打印一些属性

  • 相关阅读:
    Solaris 11 让 ls 的输出 带上颜色
    Solaris11 Vsphere client tool 的鼠标问题
    VNC Viewer连接Cent OS 时的 复制粘帖 功能
    vSphere Client的拷贝 粘帖 功能
    更改CentOS7登录画面的分辨率
    一个故意消耗内存的java程序MemoryEater
    安装CentOS7文字界面版后,无法联网,用yum安装软件提示 cannot find a valid baseurl for repo:base/7/x86_64 的解决方法
    windows 安装 Redis
    centos 安装postgresql 完整版
    centos 7 官网安装 PostgreSQL
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8329477.html
Copyright © 2020-2023  润新知