python反射

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

  • 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__)
代碼示範

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

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')()

爲何用反射之反射的好處服務器

好處一:實現可插拔機制ide

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

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

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

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

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方法
相關文章
相關標籤/搜索