面向對象【十】反射

python反射

 

反射說簡單點 --> 就是利用字符串的形式去對象(模塊)中操做(尋找/檢查/設置/刪除)成員。html

  • hasattr(object,"name")
  • getattr(object,"func","沒有這個屬性")
  • setattr(object,"alex","38")
  • delattr(object,"addr")
    class Black_Medium:
        feture = "Ugly"
        def __init__(self,name,addr):
            self.name = name
            self.addr = addr
    
        def sell_hourse(self):
            print("[%s]正在賣房子"%self.name)
        def rent_hourse(self):
            print("[%s]正在租房子"%self.name)
    b1 = Black_Medium("萬城置地","天露園")
    print(hasattr(b1,"name"))#尋找-----判斷object中有沒有一個name字符串對應的方法或屬性(就是看b1能不能調用name的方法或屬性)
    print(getattr(b1,"rent_hourse","沒有這個屬性"))#檢查-----至關於b1.rent_hourse,沒有默認參數找不到會報錯
    setattr(b1,"alex","18")#設置-----至關於b1.alex = 18
    delattr(b1,"addr")#刪除-----至關於del b1.addr
    print(b1.__dict__)
    
    代碼示範
    代碼示範

    導入其餘模塊,利用反射查找該模塊是否存在某個方法python

    1
    2
    def  test():
         print ( 'from the test' )
    複製代碼
     
    """
    程序目錄:
        module_test.py
        index.py
     
    當前文件:
        index.py
    """
    
    import module_test as obj
    
    #obj.test()
    
    print(hasattr(obj,'test'))
    
    getattr(obj,'test')()
    複製代碼

    爲何用反射之反射的好處程序員

    好處一:實現可插拔機制服務器

    有倆程序員,一個lili,一個是egon,lili在寫程序的時候須要用到egon所寫的類,可是egon去跟女友度蜜月去了,尚未完成他寫的類,lili想到了反射,使用了反射機制lili能夠繼續完成本身的代碼,等egon度蜜月回來後再繼續完成類的定義而且去實現lili想要的功能。ide

    總之反射的好處就是,能夠事先定義好接口,接口只有在被完成後纔會真正執行,這實現了即插即用,這實際上是一種‘後期綁定’,什麼意思?即你能夠事先把主要的邏輯寫好(只定義接口),而後後期再去實現接口的功能post

class FtpClient:
    'ftp客戶端,可是還麼有實現具體的功能'
    def __init__(self,addr):
        print('正在鏈接服務器[%s]' %addr)
        self.addr=addr
#from module import FtpClient
f1=FtpClient('192.168.1.1')
if hasattr(f1,'get'):
    func_get=getattr(f1,'get')
    func_get()
else:
    print('---->不存在此方法')
    print('處理其餘的邏輯')
View Code

好處二:動態導入模塊(基於反射當前模塊成員)url

複製代碼
module_t = __import__("m1.t")#只會找到m1這一層,不會找到t
print(module_t)
module_t.t.test #執行t模塊下的test方法
import importlib
m = importlib.import_module("m1.t")#直接找到t
print(m)
module_t.test #執行t模塊下的test方法
複製代碼
相關文章
相關標籤/搜索