Python 類瀏覽器支援
Python 庫中的 **pyclbr** 模組可以提取關於在 Python 模組中定義的函式、類和方法的資訊。這些資訊是從 Python 原始碼中提取的,而不是透過匯入模組來獲取。
此模組定義了 **readmodule()** 函式,該函式返回一個字典,將模組級類名對映到類描述符。該函式採用模組名作為引數。它可能是包中模組的名稱。在這種情況下,path 是一個目錄路徑序列,新增到 sys.path 前面,用於定位模組原始碼。
以下程式碼使用 readmodule() 函式來解析 Python 庫的 socket 模組中的類和方法。
import pyclbr mod = pyclbr.readmodule("socket") def show(c): s = "class " + c.name print (s + ":") methods = c.methods.items() for method, lineno in methods: print (" def " + method) print() for k, v in mod.items(): show(v)
class IntEnum: class IntFlag: def _missing_ def _create_pseudo_member_ def __or__ def __and__ def __xor__ def __invert__ class _GiveupOnSendfile: class socket: def __init__ def __enter__ def __exit__ def __repr__ def __getstate__ def dup def accept def makefile def _sendfile_use_sendfile def _sendfile_use_send def _check_sendfile_params def sendfile def _decref_socketios def _real_close def close def detach def family def type def get_inheritable def set_inheritable class SocketIO: def __init__ def readinto def write def readable def writable def seekable def fileno def name def mode def close
pyclbr 模組還定義了 **readmodule_ex()** 函式,該函式返回一個字典,其中包含模組中定義的每個函式或類描述符。返回的字典將模組級函式和類名對映到它們的描述符。巢狀物件被輸入到其父物件的 children 字典中。
>>> x = pyclbr.readmodule_ex('socket') >>> for k,v in x.items(): print (k,v) IntEnum <pyclbr.Class object at 0x000002095D7D0048> IntFlag <pyclbr.Class object at 0x000002095D7D04E0> _intenum_converter <pyclbr.Function object at 0x000002095D82F940> _GiveupOnSendfile <pyclbr.Class object at 0x000002095D822898> socket <pyclbr.Class object at 0x000002095D8227B8> fromfd <pyclbr.Function object at 0x000002095D8340B8> fromshare <pyclbr.Function object at 0x000002095D82FEF0> socketpair <pyclbr.Function object at 0x000002095D834128> SocketIO <pyclbr.Class object at 0x000002095D82FA20> getfqdn <pyclbr.Function object at 0x000002095D8344E0> create_connection <pyclbr.Function object at 0x000002095D834518> getaddrinfo <pyclbr.Function object at 0x000002095D834550>
這些函式也可以與自定義模組一起使用,以獲取使用者定義的類和方法的目錄。
在下面的示例中,使用模組 'triangles.py' 來獲取其類結構。
#triangles.py import math class Triangle: def __init__(self, a, b, c): self.a = a self.b = b self.c = c def area(self): s=(self.a+self.b+self.c)/2 area=math.sqrt(s*(s-self.a)*(s-self.b)*(s-self.c)) return area class EquiTriangle(Triangle): def __init__(self, a): b = a c = a super().__init__(a,b,c) def area(self): area=math.sqrt(3)*pow(self.a,2)/4 return area
我們現在將獲取 'triangles' 模組中的類和方法。
>>> br = pyclbr.readmodule_ex('triangles') >>> for i,j in br.items(): print (i,j.methods) Triangle {'__init__': 3, 'area': 7} EquiTriangle {'__init__': 12, 'area': 16}
pyclbr 模組定義了兩個物件——類物件和函式物件。
**函式** 物件具有以下屬性:
file | 定義函式的檔名。 |
module | 定義所描述函式的模組名。 |
name | 函式名。 |
lineno | 檔案中定義開始的行號。 |
parent | 對於頂級函式,為 None。對於巢狀函式,為其父函式。 |
children | 一個字典,將名稱對映到巢狀函式和類的描述符。 |
除了上述屬性外,**類** 物件還有兩個額外的屬性:
super | 一個類物件列表,描述正在描述的類的直接基類。 |
methods | 一個字典,將方法名對映到行號。 |
廣告