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("請重新輸入!")

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

更多相關文章
  • 類型參數 表現形式:在名稱後面以方括弧表示, 何處使用 class 中,用於定義變數、入參、返回值 函數、方法 類型邊界 上邊界 compareTo Comparable` 的子類型,即需要添加上邊界 scala class Pair[T : LowerBound` 替換第一個元素為 T 的父類 R ...
  • ① 下載JDBC-MySQL資料庫驅動 鏈接:https://pan.baidu.com/s/1KtSZZ5hXlxu2QrmsXg3lkA 提取碼:1pbl ② 載入JDBC-MySQL資料庫驅動 範例:MySQL資料庫驅動載入 Class.forNmae("com.mysql.jdbc.Driv ...
  • python day 5 2019/10/08 學習資料來自老男孩教育 [TOC] 1. 匿名函數lambda 函數名就是變數,使用lambda表達來創建一些簡單功能的函數。 lambda定義簡單函數時,比用def定義要簡潔,會用在map,reduce,filter等函數中。 def f1(x,y) ...
  • 11 構建一個簡單的Spring Boot項目 這個章節描述如何通過Spring Boot構建一個“Hello Word”web應用,側重介紹Spring Boot的一些重要功能。因為大多數的開發工具都支持Maven,所以我們使用它來構建這個應用。 網站 "spring.io" 包含了許多如何開始使 ...
  • 在讀本篇文章之前如果你讀過這篇文章 "SpringBoot自動裝配原理解析" 應該會更加輕鬆 準備工作 我們知道SpringBoot的自動裝配的秘密在 包下的 文件中,而嵌入Tomcat的原理就在這個文件中載入的一個配置類: 首先看一下上方的幾個註解 1. 這個註解是決定配置類的載入順序的,當註解里 ...
  • 直接訪問redis的中國官網,在下載部分,可以看到安裝和使用的方式。wget http://download.redis.io/releases/redis-5.0.4.tar.gztar xzf redis-5.0.4.tar.gzcd redis-5.0.4make./src/redis-ser ...
  • xml即可擴展標記語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 本文主要學習的ElementTree是python的XML處理模塊,它提供了一個輕量級的對象模型。在使用ElementTree模塊時,需要import xml.etree.ElementTre ...
  • 在學習Python的是後遇到點小問題,記錄下來以後忘了再來看看。 一. python2 和python3在繼承父類的時候是不同的。super() 是一個特殊的函數,幫助Python將父類和子類關聯起來。在Python3中,直接使用如下代碼: Python3 在Python2中有兩種方法: 第一種 第 ...
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...