1. 程式人生 > >Python中對於反射的理解

Python中對於反射的理解

反射簡單的理解:就是利用字串的形式去物件(模組)中操作(尋找/檢查/刪除/設定)(最簡單理解就是通過字串操作屬性)接下來讓我們記錄下反射的幾個方法:

hasattr
  • 判斷物件中是否有這個方法或變數
class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s正在吃便便" % self.name)

dog = Dog('鐵牛')
print hasattr(dog, 'name')  # True 因為存在name這個變數
print hasattr(dog, 'eat') # True 因為存在eat這個方法 print hasattr(dog , 'play') # False 因為不存在play這個方法或者變數
getattr
  • 獲取物件中的方法或變數的記憶體地址
class Dog(object):

    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s 正在吃便便" % self.name)

dog = Dog('鐵牛')

get_dog = getattr(dog, 'name'
) # 獲取name變數記憶體地址 print get_dog # 此時列印的是鐵牛 eat_dog = getattr(dog, 'eat') # 獲取eat方法的記憶體地址 eat_dog() # 此時列印的是 "鐵牛正在吃便便" print eat_dog # 此時列印的是 <bound method Dog.eat of <__main__.Dog object at 0x00000000037EE6A0>> # 接下來我們看getattr有三個引數,那麼第三個引數是什麼呢 ?我們驗證一下:
# getattr(o, name, default) print getattr(dog, 'play', 'Not find') # 此時列印的是Not find 因為 dog物件中沒有play這個的變數或者方法
setattr
  • 給物件新增變數或方法
def drink(self):
    print("%s 正在喝beer" % self.name)


class Dog(object):
    def __init__(self, name):
        self.name = name


dog = Dog('鐵牛')
setattr(dog, 'eat', drink)  # 將drink函式新增到物件dog中, 並且命名為eat
dog.eat(dog)                # 呼叫eat方法, 因為這是額外新增的方法, 需手動傳入物件

setattr(dog, 'age', 18)    # 新增一個變數, 複製為18
print dog.age              # 列印結果為:18
delattr
  • 刪除 物件中的變數。注意:不能用於刪除
class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s 正在吃便便" % self.name)


dog = Dog('鐵牛')
delattr(dog, 'name')  # 此時刪除name屬性
print dog.name        # 此時會報錯:AttributeError: 'Dog' object has no attribute 'name'  因為delattr:將上面的"name"屬性刪除了
delattr(dog, 'eat')     # AttributeError: eat  報錯!!!  因為delattr 不能用於刪除方法,只能刪除屬性