獲取對象信息

type()函數api

  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類型ssh

    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()函數ui

  isinstance()判斷的是一個對象是不是該類型自己,或者位於該類型的父繼承鏈上spa

  要優先使用isinstance()判斷類型,這樣可將指定類型及其子類"一網打盡"code

    #繼承關係是: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

  判斷一個變量是不是某些類型中的一種blog

    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                                                
相關文章
相關標籤/搜索