Python 入門 之 反射

来源:https://www.cnblogs.com/caiyongliang/archive/2019/10/08/11638354.html

Python 入門 之 反射 通過字元串操作對象的屬性和方法 對象的角度使用反射 類的角度使用反射 當前模塊使用反射 其他模塊使用反射 反射的應用場景 ...


Python 入門 之 反射

1、反射 : (自省)

​ 反射主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。

Python面向對象中的反射:通過字元串的形式操作對象的相關屬性。Python中的一切事物都是對象(都可以使用反射)

<1> getattr() 獲取
<2> setattr() 設置
<3> hasattr() 判斷是否存在
<4> delattr() 刪除

(1)通過字元串操作對象的屬性和方法

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

    def func(self):
        print("is A func")
a = A("rimo")


A.func()
print(a.name)
a.func()

(2)對象的角度使用反射

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

    def func(self):
        print("is A func")
a = A("rimo")

print(hasattr(a,"name"))  # 返回 True就是說明name這個屬性在對象a中存在

print(getattr(a,"name"))
f = getattr(a,"func")
f()
setattr(a,"age",18)
print(a.__dict__)

delattr(a,"name")
print(a.__dict__)

(3)類的角度使用反射

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

    def func(self):
        print("is A func")

a = A("rimo")

print(hasattr(A,"name"))
f = getattr(A,"func")
f(11)

(4)當前模塊使用反射

def func():
    print("is func")

# 當前模塊:
print(globals()["func"])

import sys
o = sys.modules[__name__]   # 獲取當前模塊名對應的對象
f = getattr(o,"func")
f()

(5)其他模塊使用反射

import test       # 導入模塊
test.func()

o = globals()["test"]
getattr(o,"func")()

(6)反射的應用場景

class Blog:

    def login(self):
        print("is login")

    def register(self):
        print("is register")

    def comment(self):
        print("is comment")

    def log(self):
        print("is log")

    def log_out(self):
        print("is log_out")

b = Blog()

func_dic = {
    "1":b.login,
    "2":b.register,
    "3":b.comment,
    "4":b.log,
    "5":b.log_out
}

msg = """
1.登錄
2.註冊
3.評論
4.日誌
5.註銷
"""

choose = input(msg)
if choose in func_dic:
    func_dic[choose]()
將上述代碼進行修改,減少代碼(通過字元串操作對象的屬性和方法)
class Blog:
    def login(self):
        print("is login")

    def register(self):
        print("is register")

    def comment(self):
        print("is comment")

    def log(self):
        print("is log")

    def log_out(self):
        print("is log_out")

b = Blog()

msg = """
login
register
comment
log
log_out
"""

while 1:
    choose = input(msg)
    if hasattr(b,choose):
        getattr(b,choose)()
    else:
        print("請重新輸入!")

您的分享是我們最大的動力!

更多相關文章
  • ``` include int main(void) { int arr[10]={5,4,7,9,2,3,1,6,10,8}; //定義一個位排序的數組 int i; //定義迴圈次數 int n = 0; //定義排序次數 int length=10; //定義數組長度 while(n arr[ ...
  • 一、random模塊 random模塊是用來生成隨機數的。 練習:生成隨機驗證碼 import random def v_code(): code = '' for i in range(5): num=random.randint(0,9) alf=chr(random.randint(65,90 ...
  • 介面表示一種能力,實現了一個介面,即擁有一種能力。 BeanDefinition與Bean的關係, 就好比類與對象的關係. 類在spring的數據結構就是BeanDefinition.根據BeanDefinition得到的對象就是我們需要的Bean. 我認為理解Bean與BeanDefinition ...
  • @EnableAutoConfiguration註解是Spring Boot中配置自動裝載的總開關。本文將從@EnableAutoConfiguration入手,嘗試分析Spring Boot對@AutoConfigurationImportSelector註解的處理過程。 ...
  • Java的日期類Date Date類 註意:是 java.util.Date ; 而非 java.sql.Date,此類是給資料庫訪問的時候使用的 示例 1 : 時間原點概念 所有的數據類型,無論是整數,布爾,浮點數還是字元串,最後都需要以數字的形式表現出來。 日期類型也不例外,換句話說,一個日期, ...
一周排行
  • 一、背景 代碼實例:https://gitee.com/D_C_L/CurtainEtcAOP.git我們實際系統中有很多操作,是不管做多少次,都應該產生一樣的效果或返回一樣的結果。 例如: 1. 前端重覆提交選中的數據,應該後臺只產生對應這個數據的一個反應結果。 2. 我們發起一筆付款請求,應該只 ...
  • 關鍵字:流程未來節點處理人 工作流快速開發平臺 工作流流設計 業務流程管理 asp.net 開源工作流 業務背景:一個流程在啟動起來後,是可以對一些節點計算出來處理人是誰,流程的走向。對於另外一些節點處理人有可能需要相關的人員調整的。在一些審批的環境下,需要把能夠計算出來的節點處理人在發起時計算出來... ...
  • 簡述 我們做軟體工作的雖然每天都離不開網路,可網路協議細節卻不是每個人都會接觸和深入瞭解。我今天就來和大家一起學習下Socket,並寫一個簡單的聊天程式。 一些基礎類 首先我們每天打開瀏覽器訪問網頁信息都是使用的HTTP/HTTPS協議,而HTTP是通過的TCP建立的連接。TCP底層又是通過的Soc ...
  • 點這裡進入ABP進階教程目錄 在功能按鈕區增加一個自定義按鈕 - Add(創建課程) 添加按鈕 打開展示層(即JD.CRS.Web.Mvc)的\wwwroot\view-resources\Views\Course\Index.js //用以存放Course查詢相關腳本 自帶按鈕已有五個我們再添加一 ...
  • 點這裡進入ABP進階教程目錄 我們嘗試在新增/編輯界面增加一個下拉框用來代替輸入框編輯Status 添加實體 打開領域層(即JD.CRS.Core)的Entitys目錄 //用以存放實體對象添加一個類StatusCode.cs //狀態信息 更新模型 更新查詢視圖模型 打開展示層(即JD.CRS.W ...
  • 在項目視圖中,找到-》輸出 視窗,在視窗中選擇ASP.NET Core Web伺服器,調試項目即可看到執行的sql語句 ...
  • 前言: 通過Fiddler抓取瀏覽器請求數據,相信大家已經都會用了,我們知道Fiddler是通過在本機計算器添加一個預設的代理伺服器來實現的抓包數據的,埠號為:8888。 其實當我們打開Fiddler的設置也可以看到: 然後查看本地計算器的網路代理設置: 基於上面的原理,Fiddler就實現了經過 ...
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 在上面已經實現DevExpress的安裝之後,拖拽一個TreeList,然後怎樣給 ...
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 DevExpress的TreeList怎樣設置數據源,從實例入手: https:/ ...
  • 場景 在開發中,經常會有一些全局作用域的常量、欄位、屬性、方法等。 需要將這些設置為全局作用域保存且其實例唯一。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 首先新建一 ...
x