• 获取对象信息


    type()函数

      type()函数用于判断基本类型

        type(123)    #输出:<class 'int'>
        type('str')    #输出:<class 'str'>
        type(None)    #输出:<type(None) 'NoneType'>
        type(abs)    #输出:<class 'builtin_function_or_method'>,如果一个变量指向函数,也可用type()判断
        type(a)    #输出:<class '__main__.Animal'>,如果一个变量指向类,也可用type()判断

      type()函数返回对应的Class类型

        type(123)==type(456)    #输出:True
        type(123)==int    #输出:True
        type('abc')==type('123')    #输出:True
        type('abc')==str    #输出:True

      使用types模块中定义的常量

        import types
        type(methodName)==types.FunctionType    #输出:True,使用types模块中定义的常量,判断对象是否是函数
        type(abs)==types.BuiltinFunctionType    #输出:True
        type(lambda x: x)==types.LambdaType    #输出:True
        type((x for x in range(10)))==types.GeneratorType    #输出:True

    isinstance()函数

      isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上

      要优先使用isinstance()判断类型,这样可将指定类型及其子类"一网打尽"

        #继承关系是:object -> Animal -> Dog -> Husky
        a = Animal()
        d = Dog()
        h = Husky()
        
        isinstance(h, Husky)    #输出:True
        isinstance(h, Dog)    #输出:True
        isinstance(h, Animal)    #输出:True
        isinstance(d, Dog) and isinstance(d, Animal)    #输出:True

      判断基本类型,能用type()判断的基本类型也可以用isinstance()判断

        isinstance('a', str)    #输出:True
        isinstance(123, int)    #输出:True
        isinstance(b'a', bytes)    #输出:True

      判断一个变量是否是某些类型中的一种

        isinstance([1, 2, 3], (list, tuple))    #输出:True
        isinstance((1, 2, 3), (list, tuple))    #输出:True

    dir()函数

      dir()函数获得一个对象的所有属性和方法,它返回一个包含字符串的list

      获得一个str对象的所有属性和方法

      dir('ABC')    #输出:['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

    getattr(),setattr()及hasattr()函数

      有时仅仅把属性和方法列出来是不够的,需配合使用getattr()、setattr()以及hasattr()
      hasattr():判断对象是否包含某属性或方法,访问对象某属性或方法时,若不确定对象是否包含,要预先使用该函数进行判断,否则直接通过"对象.属性或方法"的方式会报错
      getattr():获取对象某属性或方法,可使用hasattr()预先判断对象是否包含
            也可直接使用该函数获取,如果没有,则返回指定默认值,否则直接通过"对象.属性或方法"的方式会报错
      setattr():给对象设置某属性或方法,并赋值

      

      只有在不知道对象信息的时候,才会去获取对象信息,如果可以通过"对象.属性",就不要通过 getattr()方式获取属性值

      假设希望从文件流fp中读取图像,首先要判断该fp对象是否存在read方法
      如果存在,则该对象是一个流,如果不存在,则无法读取,可通过hasattr()判断
      请注意,在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流
      它也可能是网络流,也可能是内存中的一个字节流
      但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能,以下是正确的方法例子:

      def readImage(fp):
          if hasattr(fp, 'read'):
              return readData(fp)
          return None

      使用示例

        class MyObject(object):
        
            def __init__(self):
                self.x = 9
                
            def power(self):
                return self.x * self.x
        
        obj = MyObject()
        hasattr(obj, 'x')    #输出:True,判断对象obj是否有'x'属性
        print(obj.x)    #输出:9
        hasattr(obj, 'y')    #输出:False,判断对象obj是否有'y'属性
        
        setattr(obj, 'y', 19)    #为对象obj设置一个属性'y'
        hasattr(obj, 'y')    #输出:True
        getattr(obj, 'y')    #输出:19
        print(obj.y)    #输出:19
        
        getattr(obj, 'z') #输出:报错,如果试图获取不存在的属性,会抛出AttributeError的错误,对象obj没有属性'z'
        getattr(obj, 'z', 404)    #输出:404,可以传入一个default参数,如果属性不存在,就返回默认值,获取属性'z',如果不存在,返回默认值404
        
        hasattr(obj, 'power')    #输出:True,判断对象obj是否有'power'方法
        getattr(obj, 'power')    #输出:<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>,获取对象obj的'power'方法
        fn = getattr(obj, 'power')    #获取对象obj的'power'方法并赋值到变量fn
        fn #输出:<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>,fn指向obj.power
        fn()  #输出:81                                                
  • 相关阅读:
    【RL-TCPnet网络教程】第3章 初学RL-TCPnet的准备工作及其快速上手
    【二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
    【RL-TCPnet网络教程】第2章 嵌入式网络协议栈基础知识
    【二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
    【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈
    徐州网络赛H-Ryuji doesn't want to study【线段树】
    徐州网络赛F-Feature Trace【暴力】
    徐州网络赛C-Cacti Lottery【DFS】
    南京网络赛I-Skr【回文树模板】
    AC自动机
  • 原文地址:https://www.cnblogs.com/shiliye/p/10967737.html
Copyright © 2020-2023  润新知