反射

 

反射

什麼是反射?

  • 本質上就是經過字符串對對象進行操做

經常使用:

  • hasattr(object, name)
    • 判斷name是不是object的屬性,返回一個布爾值。
    • name必須是字符串,object能夠是任何有方法的對象,包括:類、類的實例、模塊。
  • getattr(object, name[, default])
    • 調用object的name屬性或者方法,失敗時返回default
    • 一般和hasattr方法連用
    class Foo: f = '類的靜態字段' def __init__(self, name): self.name = name self.common = '類的普通字段' def say_hi(self): print('hi, %s' % self.name) obj = Foo('jack') # 判斷是否含有某屬性 print(hasattr(Foo, 'f')) print(hasattr(obj, 'name')) print(hasattr(obj, 'say_hi')) # 獲取屬性 print(getattr(Foo, 'f')) print(getattr(obj, 'name')) getattr(obj, 'say_hi')() print(getattr(obj, 'empty', "Does't exist.")) 
  • 關於模塊python

    import sys if hasattr(sys.modules[__name__], 'Foo'): getattr(getattr(sys.modules[__name__], 'Foo')('jack'), 'say_hi')() 
  • 經過sys.moudules獲得當前已加載的模塊列表,使用__name__獲取本文件的對象,判斷是否有Foo屬性,若是有則調用Foo屬性並實例化出一個對象,調用對象的say_hi方法。

不經常使用:

  • setattr(object, name, value)
    • getattr的一個變種,能夠對object的name屬性進行賦值操做
    setattr(obj, 'name', 'other') print(getattr(obj, 'name')) 
    • 若是name屬性不存在則會爲其建立一個值爲value的name屬性
    • value能夠是函數,包括另外定義的函數或者匿名函數,可是調用的時候必需要額外進行賦值操做
  • delattr(object, name)
    • 用於刪除object的name屬性,如不存在屬性則報AttributeError
相關文章
相關標籤/搜索