python反射機制

2021-09-10 06:04:35 字數 3612 閱讀 3182

根據不同的場景執行不同的函式,可以將這種寫入配置中,讀取配置,執行對應的函式,這個時候獲取的函式為字串,如何執行該字串呢?

反射就是通過字串的形式,匯入模組;反射就是通過字串的形式,匯入模組;

通過字串的形式,去模組尋找指定函式,並執行。

利用字串的形式去物件中操作屬性或者函式利用字串的形式去物件中操作屬性或者函式

一種基於字串的事件驅動一種基於字串的事件驅動

getattr(object, filed, default)

從物件object中獲取field物件(可能為屬性或者方法),如果不存在,則返回預設值default

hasattr(object, field)

判斷物件object中是否含有field物件,返回true/false

setattr(object, field, value)**

object.field = value (賦值操作)

delattr(object, field)**

刪除物件的某個屬性

上述四個函式中的filed均為字串型別,用來表示物件的乙個屬性名或者方法名

# coding=utf8

class a(object):

static_name = 'static_name' # 靜態屬性

def __init__(self):

self.name = 'name ' # 屬性名

def func_name(self, name=''):

self.name = name

print name

@staticmethod

def static_func_name(self, name='11'):

static_name = name

print static_name

if __name__ == '__main__':

print(hasattr(a, 'name')) # false

print(hasattr(a(), 'name')) # true

print(hasattr(a, 'static_name')) # true

print(hasattr(a(), 'static_name')) # true

print(hasattr(a, 'name')) # false

print(hasattr(a(), 'name')) # true

print(hasattr(a, 'static_func_name')) # true

print(hasattr(a(), 'static_func_name')) # true

通過這個,也可以清晰的看出來類屬性物件屬性的差別

if __name__ == '__main__':

print(getattr(a, 'static_name', 'default_name')) # static_name

print(getattr(a, 'name', 'default_name')) # default_name 這個沒有取到,所以用了預設值,類屬性和物件屬性

print(getattr(a(), 'name', 'default_name')) # name

print(getattr(a(), 'error_name', 'default_name')) # 'default_name' 這個沒有渠道

getattr(a, 'static_func_name', 'f')(name='a.static_func_name()') # a.static_func_name()

getattr(a(), 'func_name', 'f')(name='a.func_name()') # a.func_name()

print(getattr(a(), 'func_name', none)) # >

print(getattr(a, 'func_name', none)) # 未找到的意思 相當於none值

回到第乙個應用場景

首先,我們可以定義乙個類或者模組,在類中定義不同場景下執行的不同的函式

然後將該函式和場景寫成配置,

在不同的場景下,讀取配置,首先使用hasattr判斷該函式是否存在,然後使用getattr執行該函式

如果想,類也可以配置,不過,所有場景寫在乙個固定類裡面,等以後新增新的場景的時候,會容易配置一些

動態匯入乙個模組名

import(『module_name』)

匯入模組下的子模組

import(『module_name』, fromlist = true)

exec(「print(『hello』)」)

eval(expression, globals=none, locals=none)

官方文件:

x = 1

print(eval('x + 1'))

不推薦使用eval,會有安全問題

物件的內建函式或者方法

dir(a())

返回a物件的函式和方法:

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'func_name', 'name', 'static_func_name', 'static_name']

dir(a)

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'func_name', 'static_func_name', 'static_name']

a.__doc__     # 類的描述資訊

a.__name__ # 類名

a.__dict__ # 包含了模組裡可用的屬性名-屬性的字典;也就是可以使用模組名.屬性名訪問的物件。

a.__dict__ =

python反射機制

本文總結python的反射機制,以及其簡單應用 首先要說的是globals 函式 在沒有任何模組匯入的情況下,執行globals函式,函式返回的是乙個包含當前作用域的全域性變數的字典,key是全域性範圍內物件的名字。globals 然後先導入乙個模組 os 在執行globals函式 import o...

python反射機制

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

python 反射機制

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