Python中對於反射的理解
阿新 • • 發佈:2018-12-03
反射簡單的理解:就是利用字串的形式去物件
(模組)中操作(尋找/檢查/刪除/設定)(最簡單理解就是通過字串操作屬性)接下來讓我們記錄下反射的幾個方法:
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 不能用於刪除方法,只能刪除屬性