1. 程式人生 > >python學習日記(OOP——反射)

python學習日記(OOP——反射)

反射

反射就是通過字串的形式,匯入模組;通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件(模組)中操作(查詢/獲取/刪除/新增)成員,一種基於字串的事件驅動!

hasattr

判斷物件中是否有這個方法或變數

class Person(object):
    def __init__(self,name):
        self.name = name
    def walk(self):
        print('{} is walking'.format(self.name))

li = Person('libai')
print(hasattr(li,'
name'))#True。因為存在name變數 print(hasattr(li,'walk'))#True。因為存在walk方法 print(hasattr(li,'age'))#False。因為不存在age方法或變數

getattr

獲取物件中的方法或變數的記憶體地址

class Person(object):
    def __init__(self,name):
        self.name = name
    def walk(self):
        print('{} is walking'.format(self.name))

li 
= Person('libai') n = getattr(li,'name')#獲取name變數的記憶體地址 print(n) f = getattr(li,'walk')#獲取walk方法的記憶體地址 f() #呼叫walk方法 #我們發現getattr有三個引數,那麼第三個引數是做什麼的呢? s = getattr(li,'age','not found') print(s) # 列印結果:not find。因為age在物件s中找不到,本應該報錯,屬性找不到,但因為修改了找不到就輸出not find

hasattr、getattr練習

# 通過反射
# 物件名 獲取物件屬性 和 普通方法
# 類名 獲取靜態屬性 和類方法 和 靜態方法

參考原始碼:hasattr_getattr.py

setattr

為物件新增變數或方法

def func(self):
    print('{} is walking'.format(self.name))

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

li = Person('libai')
setattr(li,'walk',func)#將func函式新增到物件li中,並命名為walk
li.walk(li)            #呼叫walk方法,因為這是額外新增的方法,需要手動傳入物件

setattr(li,'age',28)    #新增一個變數age
print(li.age)           #列印結果

delattr

刪除物件中的變數。注意:不能用於刪除方法

class Person(object):
    def __init__(self,name):
        self.name = name
    def walk(self):
        print('{} is walking'.format(self.name))

li = Person('libai')

delattr(li,'name')  #刪除name 變數
print(li.name)      #引發異常

 反射當前模組成員

name = 'kk'
import sys
# print(sys.modules)
# print(getattr(sys.modules['__main__'],'name'))
print(getattr(sys.modules[__name__],'name'))#獲取當前模組的屬性
import time
t = input('>>>')

#不帶引數,測試輸入:asctime
# ti = getattr(time,t)
# print(ti())

#帶引數的處理,測試輸入:strftime
ti = getattr(time,t)('%Y-%m-%d %H:%M:%S')
print(ti)