python反射機制

2021-07-09 01:13:54 字數 2198 閱讀 9436

本文總結python的反射機制,以及其簡單應用

首先要說的是globals()函式

在沒有任何模組匯入的情況下,執行globals函式,函式返回的是乙個包含當前作用域的全域性變數的字典,key是全域性範圍內物件的名字。

>>> globals()

然後先導入乙個模組(os),在執行globals函式

>>> 

import os

>>> globals()

可以發現在返回的字典中, 多了os模組以及其path

如果匯入類,在返回字典中也可以找到類。

>>> 

import sys

>>>

from sys import getsizeof

>>> globals()

接下來關於globals的幾個簡單應用:

因為globals返回的是字典,可以利用key得到模組或者類

>>> globals()

>>> globals()['getsizeof']

in function getsizeof>

>>>

所以如果你想例項化乙個物件:

>>> ok  = globals()['getsizeof']

>>> ok

in function getsizeof>

>>>

這樣的方法有一定的侷限性,要在globals函式之前匯入相應的類,如果不匯入,則globals函式返回的字典中就不存在關於這個類的資訊,就會出現異常。

所以介紹一種動態匯入的方法:

__import__函式出現了。。。。。。。

我認為__import__()函式就像乙個轉換器一樣,相當於乙個翻譯官。還是先看例子:

現在有乙個字串str = 'sys', 如果我想用字串的而形式匯入怎麼實現? import str ????? 肯定是不可以的。

首先可以從globals函式返回字典中,看出還未匯入任何模組

>>> globals()

然後嘗試利用字串形式匯入sys模組,很明顯是不可以的。這是因為python只知道str是儲存字串的變數。

>>> str = 'sys'

>>> import str

traceback (most recent call last):

file

"", line 1, in

importerror:no

module

named

str

下面就是關於import的用法

>>> module = __import__(str)

>>> globals()

>>>

還可以直接以字串形式匯入module = __import__('re')

最後結合getattr()函式,用來匯入模組,並呼叫其類和方法

getattr,傳入引數是物件和該物件的函式或者屬性的名字,返回物件的函式或者屬性例項

來個例子:

>>> module = __import__('string')

>>> func = getattr(module,'split')

>>>

globals驗證一下

>>> globals()

>>>

補充一下callable函式,如果傳入的引數是可以呼叫的函式,則返回true,否則返回false。

>>> callable(getattr(module,'split'))

true

>>> callable(getattr(module,'__doc__'))

false

>>>

例子簡單很好理解,可能會覺得並沒有看出這個反射機制並沒有多麼牛。。。。。。。我也。。。。。。

**是慢慢積累出來的,一點點弄清楚,才能寫出更優秀的**,共勉!!!

python反射機制

反射的本質 反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件 模組 中操作 查詢 獲取 刪除 新增 成員,一種基於字串的事件驅動!下面我們通過反射機制在web路由上的應用來介紹反射 首先我們來看如下 的設計 users.py 模組中 visit模組中...

python反射機制

根據不同的場景執行不同的函式,可以將這種寫入配置中,讀取配置,執行對應的函式,這個時候獲取的函式為字串,如何執行該字串呢?反射就是通過字串的形式,匯入模組 反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件中操作屬性或者函式利用字串的形式去物件中操作屬...

python 反射機制

反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式,並執行。利用字串的形式去物件 模組 中操作 查詢 獲取 刪除 新增 成員,一種基於字串的事件驅動!1.getattr 函式是python自省的核心函式,具體使用大體如下 class a def init self self.nam...