python自省與反射

DAY 5. python自省

這是很久之前寫的,當時對自省和反射的概念沒理解,學習Java以后多了一點理解,自省是獲取對象的能力,反射是操縱對象的能力,python中使用getattr()setattr()實現反射,而其他的則是自省,下面的內容是把兩者混在一起說的,但又不想改了,內容羅里吧嗦,把最終的總結提到前面

方法作用
help()查看函數或模塊用途的詳細說明
dir()返回對象所有屬性
type()查看對象類型
hasattr()查看對象是否有特定屬性
getattr()得到對象的特定屬性
setattr()設置對象的特定屬性
isinstance()判斷一個對象是否是一個已知的類型
issubclass()判斷一個類是不是另一個類的子類
id()返回地址值
callable()判斷對象是否可調用

In computing, type introspection is the ability of a program to examine the type or properties of an object at runtime. Some programming languages possess this capability.
在計算機科學中,內省是指計算機程序在運行時(Run time)檢查對象(Object)類型的一種能力,通常也可以稱作運行時類型檢查

這是維基百科對自省(內省)的解釋,通俗來說,自省就是在程序運行過程中,能夠知道對象的類型的一種能力,大部分語言都有這種能力(都有辦法在運行過程中知道對象的類型),如c++,Java等

當然自省不僅僅只針對對象的類型,如python自省還能知道對象的屬性,還有一些其他的理解

在日常生活中,自省(introspection)是一種自我檢查行為。

在計算機編程中,自省是指這種能力:檢查某些事物以確定它是什么、它知道什么以及它能做什么。自省向程序員提供了極大的靈活性和控制力。

說的更簡單直白一點:自省就是面向對象的語言所寫的程序在運行時,能夠知道對象的類型。簡單一句就是,運行時能夠獲知對象的類型。

例如c++自省(來自維基百科)

C ++通過運行時類型信息(RTTI)typeid和dynamic_cast關鍵字支持類型內省。 dynamic_cast表達式可用于確定特定對象是否屬于特定派生類。 例如:

Person* p = dynamic_cast<Person *>(obj);
if (p != nullptr) {p->walk();
}

typeid運算符檢索std :: type_info對象,該對象描述對象的派生類型:

if (typeid(Person) == typeid(*obj)) {serialize_person( obj );
}

php自省(來自維基百科)

在php中,可以使用instanceof運算符判斷一個PHP變量是否屬于某一類的實例

if ($obj instanceof Person) {// Do whatever you want
}

Java自省(來自維基百科)

Java中類型自省的最簡單示例是instanceof運算符。 instanceof運算符確定特定對象是屬于特定類(或該類的子類,還是實現該接口的類)。 例如:

if (obj instanceof Person) {Person p = (Person)obj;p.walk();
}

5.1 python實現自省的辦法

python實現自省有很多方法,常用的有 help(),dir(),type(),hasattr(),getattr(),setattr(),isinstance(),issubclass(),id(),callable()

5.1.1 help()

help() 函數用于查看函數或模塊用途的詳細說明。主要在IDE環境下是用,接受任何擁有函數或者方法的對象,打印出對象所有的函數和文檔字符串

如可以直接打印出os模塊的幫助文檔

import os
help(os)
# Help on module os:
#
# NAME
#     os - OS routines for NT or Posix depending on what system we're on.
#
# DESCRIPTION
# 后面的省略了

也可以是我們自定義的類,函數,或模塊

class Demo:"""this is a Demo"""classVar = 0def __init__(self):self.var1 = 1def output(self):print(self.var1)if __name__ == '__main__':help(Demo)

運行之后會打印出這個類的完整信息

Help on class Demo in module __main__:class Demo(builtins.object)|  this is a Demo|  |  Methods defined here:|  |  __init__(self)|      Initialize self.  See help(type(self)) for accurate signature.|  |  output(self)|  |  ----------------------------------------------------------------------|  Data descriptors defined here:|  |  __dict__|      dictionary for instance variables (if defined)|  |  __weakref__|      list of weak references to the object (if defined)|  |  ----------------------------------------------------------------------|  Data and other attributes defined here:|  |  classVar = 0

實例對象會打印出類的信息

函數會打印出幫助文檔,沒有文檔會打印none

 def demoMethods(a):"""這是一個示例函數:param a: 示例形參:return: None"""print(a)help(demoMethods)
# Help on function demoMethods in module __main__:# demoMethods(a)
#     這是一個示例函數
#     :param a: 示例形參
#     :return: None

更詳細的請看這篇文章

Python-自省機制

5.1.2 dir()

dir() 函數不帶參數時,返回當前范圍內的變量、方法和定義的類型列表;帶參數時,返回參數的屬性、方法列表。如果參數包含方法__dir__(),該方法將被調用。如果參數不包含__dir__(),該方法將最大限度地收集參數信息。

dir()
['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'sys']
dir([])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

5.1.3 hasattr(),getattr(),setattr()

class Demo:def __init__(self):self.var1 = 0self.var2 = 1if __name__ == '__main__':demo = Demo()if hasattr(demo,'var1'):setattr(demo,'var1',2)print(getattr(demo,'var1','not find'))  # 2print(getattr(demo,'var11','not find'))  # not find
  • hasattr()
def hasattr(*args, **kwargs): # real signature unknown"""Return whether the object has an attribute with the given name.返回對象是否具有給定名稱的屬性。This is done by calling getattr(obj, name) and catching AttributeError.這是通過調用getattr(obj,name)并捕獲AttributeError來完成的."""pass
  • setattr()
def setattr(x, y, v): # real signature unknown; restored from __doc__"""Sets the named attribute on the given object to the specified value.將給定對象的命名屬性設置為指定值。setattr(x, 'y', v) is equivalent to ``x.y = v''setattr(x,‘y’,v)等價于“x.y=v”"""pass
  • getattr()
def getattr(object, name, default=None): # known special case of getattr"""getattr(object, name[, default]) -> valueGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.When a default argument is given, it is returned when the attribute doesn'texist; without it, an exception is raised in that case.從對象中獲取指定名稱的屬性;getattr(x,‘y’)等同于X.Y。如果給定了默認參數,則未找到該屬性時將返回該參數。如果未指定,則會引發異常。"""pass

5.1.4 isinstance(),issubclass()

>>> help(isinstance)
Help on built-in function isinstance in module builtins:isinstance(obj, class_or_tuple, /)Return whether an object is an instance of a class or of a subclass thereof.返回對象是類的實例還是其子類的實例。A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target tocheck against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)or ...`` etc.

instance類似于type(),只不過type() 不會認為子類是一種父類類型,不考慮繼承關系。isinstance() 會認為子類是一種父類類型,考慮繼承關系。

>>> class A:pass>>> a = A()
>>> isinstance(a,type)
False
>>> class B(A):pass>>> b=B()
>>> isinstance(b,A)
True
>>> isinstance(int,type)
True
>>> isinstance(A,type)
True
>>> isinstance(b,type)
False
>>> isinstance(True,int)
True

可以看出類是type的子類型,也驗證了前天的元類,而布爾是int的子類

而issubclass()則是用來判斷一個類是不是另一個類的子類,傳入的兩個參數都是類名

>>> issubclass(B,A)
True

5.1.5 id()和callable()

  • id(): 用于獲取對象的內存地址
  • callable():判斷對象是否可以被調用。

5.1.6 type()

這個函數在元類中寫過了,當傳入一個參數時會返回對象的類型,這也是python自省中比較常用的方法

5.2 總結

  • 什么是自省

簡單來說就是在程序運行過程中能知道對象類型(還有屬性等)的能力

  • python實現自省的方法
方法作用
help()查看函數或模塊用途的詳細說明
dir()返回對象所有屬性
type()查看對象類型
hasattr()查看對象是否有特定屬性
getattr()得到對象的特定屬性
seetattr()設置對象的特定屬性
isinstance()判斷一個對象是否是一個已知的類型
issubclass()判斷一個類是不是另一個類的子類
id()返回地址值
callable()判斷對象是否可調用

參考文章

python面試題

wikipedia Type introspection

Python自省(反射)指南【轉】

在這篇文章中說

在筆者,也就是我的概念里,自省和反射是一回事,當然其實我并不十分確定一定以及肯定…

但是我在維基百科看見了這句話

Introspection should not be confused with reflection, which goes a step further and is the ability for a program to manipulate the values, meta-data, properties and/or functions of an object at runtime.

也就是說自省和反射不是同一回事,自省是獲取對象類型的能力,而反射是操縱對象的值,元數據,屬性和/或函數的能力

Python常用的自省函數

Python-自省機制

Python自省

菜鳥教程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457599.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vb.net 窗體接收鍵盤事件_(十五)C#WinFrom自定義控件系列-鍵盤(二)

前提入行已經7,8年了&#xff0c;一直想做一套漂亮點的自定義控件&#xff0c;于是就有了本系列文章。本系列文章將講解各種控件的開發及思路&#xff0c;歡迎各位批評指正。此系列控件開發教程將全部在原生控件基礎上進行重繪開發&#xff0c;目標的扁平化、漂亮、支持觸屏。如…

centos下cmake安裝

步驟一、安裝gcc等必備程序包&#xff08;已安裝則略過此步&#xff0c;用gcc -v檢測&#xff09; yum install -y gcc gcc-c make automake 步驟二、安裝wget &#xff08;已安裝則略過此步&#xff09; yum install -y wget 步驟三、獲取CMake源碼包 wget http://www.cmake.…

python 生成式,迭代器,生成器

DAY 6. 生成式,迭代器&#xff0c;生成器 6.1 生成式 6.1.1 列表生成式 list [index for index in range(10)]6.1.2 字典生成式 dict {zhangsan: 10,lisi: 12,wangwu: 18 } # 實現鍵值互換 dict {k:v for v,k in dict.items() if k > 12}6.1.3 集合生成式 # 100以內…

shell MAC 地址 校驗

/**************************************************************************************** shell MAC 地址 校驗* 說明&#xff1a;* 要對MAC地址進行校驗&#xff0c;記錄一下正則表達式寫法&#xff0c;有些方法在PC上驗證是可行的&…

移動端Web開發如何處理橫豎屏

<!Doctype html> <html> <head> <meta charset"utf-8"> <meta id"viewport" name"viewport" content"widthdevice-width,initial-scale1.0;"> <title>橫豎屏切換檢測</title> <style ty…

恩智浦智能車大賽2020_內蒙古科技大學第九屆智能車大賽校內公開賽總決賽

為了激發學生的創新意識&#xff0c;提高學生的動手能力&#xff0c;培養團隊合作意識&#xff0c;秉承“實踐源于真知&#xff0c;創新放飛夢想”的思想。2020年12月6日&#xff0c;內蒙古科技大學第九屆智能車大賽總決賽如約而至。本次大賽有來自各院系的223支隊伍報名參加了…

python格式化字符串的三種方法(%,format,f-string)

DAY 7. 格式化字符串 到目前為止&#xff0c;我所知道的&#xff0c;python格式化字符串有三種方法&#xff0c;第一是早期就有的%&#xff0c;其次是2.5之后的format(),還有就是3.6添加的f字符串調試 7.1 %格式化字符串 %格式化字符串是python最早的&#xff0c;也是能兼容…

Android App 優化之 ANR 詳解

為了便于閱讀, 應邀將Android App性能優化系列, 轉移到掘金原創上來.掘金的新出的"收藏集"功能可以用來做系列文集了. 今天先來聊聊ANR. 1, 你碰到ANR了嗎 在App使用過程中, 你可能遇到過這樣的情況: 恭喜你, 這就是傳說中的ANR. 1.1 何為ANR ANR全名Application Not…

微信高級群發接口正文亂碼解決方案

content里面的內空如果含有html標簽的話&#xff0c;需要對內容進行一下轉義。如果里面含有style".."類似于這樣的帶""號的內容的話&#xff0c;就更需要注意了。 foreach ($news as &$item) {foreach ($item as $key > $val){if ($key content){$…

python *args和**kwargs以及序列解包

DAY 8. *args和**kwargs *args&#xff1a;多值元組&#xff0c;**kwargs多值字典&#xff0c;他們是python函數傳參時兩個特殊的參數&#xff0c;args和kwargs并不是強制的&#xff0c;但習慣使用這兩個&#xff0c;如果在函數參數列表中聲明了*args&#xff0c;則允許傳遞任…

解讀直播連麥與點播加密

近年來&#xff0c;直播熱潮持續升溫。有需求就會有變革&#xff0c;直播的相關技術也在不斷更新&#xff0c;為直播行業帶來更好地服務。如&#xff1a;直播連麥與點播加密技術等。 直播連麥&#xff0c;即主播與連麥者通過互動直播中心進行實時互動&#xff0c;信息在云端混流…

血紅蛋白判斷access程序答案_普渡大學開發智能手機應用程序 幫助評估貧血癥情況...

醫生診斷貧血疾病的方法之一&#xff0c;就是通過觀察患者的眼皮&#xff0c;判斷眼皮是否發紅&#xff0c;從而判斷紅細胞的數量。但對醫生來說&#xff0c;面臨的挑戰是&#xff0c;這種簡單的測試不夠精確&#xff0c;無法不從患者身上抽取血樣就能給出診斷。美國普渡大學的…

學習筆記:AC自動機

話說AC自動機有什么用......我想要自動AC機 AC自動機簡介&#xff1a; 首先簡要介紹一下AC自動機&#xff1a;Aho-Corasick automation&#xff0c;該算法在1975年產生于貝爾實驗室&#xff0c;是著名的多模匹配算法之一。一個常見的例子就是給出n個單詞&#xff0c;再給出一段…

python閉包和裝飾器

DAY 9. 閉包和裝飾器 9.1 閉包 閉包就是內部函數對外部函數作用域內變量的引用 可以看出 閉包是針對函數的&#xff0c;還有兩個函數&#xff0c;內部函數和外部函數閉包是為了讓內部函數引用外部函數作用域內的變量的 我們先寫兩個函數 def fun1():print("我是fun1&q…

學歷是銅牌,能力是銀牌,人脈是金牌,思維是王牌

有人工作&#xff0c;有人上學&#xff0c;大家千萬不要錯過這篇文章&#xff0c;能看到這篇文章也是一種幸運&#xff0c;真的受益匪淺&#xff0c;對我有很大啟迪&#xff0c;這篇文章將會改變你我的一生&#xff0c;真的太好了&#xff0c;希望與有緣人分享&#xff0c;也希…

石頭剪刀布python編程_《python核心編程第二版》練習題——游戲:石頭剪刀布

習題里比較有意思的一個題目&#xff0c;實現石頭剪刀布這個游戲&#xff0c;起初設計的時候走彎路了(主要時被習題里那個“盡量少用if判斷”給整暈了)&#xff0c;想的太復雜&#xff0c;后來發現其實非常簡單&#xff0c;完全可以不寫if語句。還是枚舉法&#xff1a;#! /usr/…

SpringMvc面試題

f-sm-1. 講下SpringMvc和Struts1,Struts2的比較的優勢 性能上Struts1>SpringMvc>Struts2 開發速度上SpringMvc和Struts2差不多,比Struts1要高f-sm-2. 講下SpringMvc的核心入口類是什么,Struts1,Struts2的分別是什么 SpringMvc的是DispatchServlet,Struts1的是ActionServl…

python 鴨子類型

DAY 10. 鴨子類型 這個概念來源于美國印第安納州的詩人詹姆斯惠特科姆萊利&#xff08;James Whitcomb Riley,1849-1916&#xff09;的詩句&#xff1a;”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”…

thinkphp一句話疑難解決筆記

URL_PATHINFO_DEPR, depr表示 網頁路徑"分隔符",用"-", 有利于seo,注意是從 sername/index.php(開始的)/home-user-login-var-value開始的,pathinfo也支持普通的參數傳值(僅僅支持參數...). 在thinkphp中,有兩個地方使用depr,另一個就是tpl的文件目錄組織分…

python選取特定行_pandas.DataFrame選取/排除特定行的方法

pandas.DataFrame選取特定行使用Python進行數據分析時&#xff0c;經常要使用到的一個數據結構就是pandas的DataFrame&#xff0c;如果我們想要像Excel的篩選那樣&#xff0c;只要其中的一行或某幾行&#xff0c;可以使用isin()方法&#xff0c;將需要的行的值以列表方式傳入&a…