Python 獲取對象信息的所有方法

在 Python 里,我們經常需要檢查一個對象的類型、屬性、方法,甚至它的源碼。這對調試、學習和動態編程特別有用。今天我們就來聊聊獲取對象信息的常見方法,按由淺入深的順序來學習。

參考文章:Python 獲取對象信息 | 簡單一點學習 easyeasy.me

1. 用 type() 查看對象類型

最直接的方法就是 type(),它會返回對象的類型。

x = 123
print(type(x))   # <class 'int'>y = "Hello"
print(type(y))   # <class 'str'>

適合快速判斷變量屬于什么類型。


2. 用 isinstance() 判斷對象類型

isinstance() 用來判斷對象是否屬于某個類(或其子類)。

x = 3.14
print(isinstance(x, float))   # True
print(isinstance(x, int))     # False# 支持元組,一次判斷多個類型
print(isinstance(x, (int, float)))  # True

適合類型分支處理,比 type() 更靈活,因為它會考慮繼承關系。


3. 用 dir() 查看對象所有屬性和方法

dir() 會列出對象的所有屬性和方法(包括繼承的)。

print(dir("abc"))

輸出(部分):

['__add__', '__class__', '__contains__', '__eq__', ...]

小技巧dir() 會返回魔法方法(__xxx__)和普通方法混在一起,可配合 filter() 或列表推導篩掉。


4. 用 hasattr()getattr()setattr() 動態操作屬性

這三個函數能動態檢查、獲取、設置屬性。

class Person:def __init__(self, name):self.name = namep = Person("Tom")print(hasattr(p, "name"))       # True
print(getattr(p, "name"))       # Tomsetattr(p, "age", 18)
print(p.age)                    # 18

適合寫通用代碼,比如 JSON ? 對象 轉換。


5. 用 vars()__dict__ 查看對象的屬性字典

vars() 會返回對象的 __dict__ 屬性(存放實例變量的字典)。

class Car:def __init__(self, brand, price):self.brand = brandself.price = pricec = Car("Tesla", 300000)
print(vars(c))      # {'brand': 'Tesla', 'price': 300000}
print(c.__dict__)   # 同樣的結果

注意:內置類型(如 list)沒有 __dict__,因為它們用 __slots__ 或 C 實現。


6. 用 callable() 判斷對象是否可調用

可調用對象包括函數、類、實現了 __call__ 方法的實例。

print(callable(len))       # True
print(callable("hello"))   # False

7. 用 id() 獲取對象的內存地址

id() 返回對象在內存中的唯一標識(CPython 中是地址)。

x = 100
print(id(x))  # 例如 140714563326192

8. 用 help() 獲取對象的文檔說明

help() 會進入交互式幫助,顯示對象的功能和用法。

help(str)
help(str.upper)

在 IDE 或交互式終端特別有用,相當于 Python 自帶文檔查詢。


9. 用 __class____bases__ 查看類信息

class Animal: pass
class Dog(Animal): passd = Dog()
print(d.__class__)    # <class '__main__.Dog'>
print(Dog.__bases__)  # (<class '__main__.Animal'>,)

10. 用 inspect 模塊獲取更詳細信息(進階)

inspect 是 Python 官方的“對象解剖工具”,功能很全。

import inspectdef foo(a, b=1):"""這是 foo 函數的說明"""return a + bprint(inspect.getsource(foo))   # 獲取源碼
print(inspect.signature(foo))   # 獲取函數簽名
print(inspect.getdoc(foo))      # 獲取文檔字符串
print(inspect.getmodule(foo))   # 獲取所在模塊

常用函數:

  • inspect.getmembers(obj) 獲取對象所有成員
  • inspect.isfunction(obj) 判斷是否是函數
  • inspect.ismethod(obj) 判斷是否是方法

11. 用 __slots__ 限制并查看屬性(特殊場景)

class Point:__slots__ = ("x", "y")def __init__(self, x, y):self.x = xself.y = yp = Point(1, 2)
# print(vars(p))  # 會報錯,因為沒有 __dict__

有些類用 __slots__ 節省內存,這時 vars() 取不到屬性,需要自己訪問。


12. 用 gc 模塊查看所有對象(調試內存)

import gc
objs = gc.get_objects()
print(len(objs))  # 當前內存里對象的數量

13. 總結

在 Python 中,獲取對象信息的方法從基礎到進階依次是:

  1. type() / isinstance()
  2. dir() / hasattr() / getattr() / setattr()
  3. vars() / __dict__
  4. callable() / id() / help()
  5. __class__ / __bases__
  6. inspect 模塊(源碼、簽名、文檔)
  7. gc 模塊(調試對象)

學會這些方法,你就能像外科醫生一樣“剖析”任何 Python 對象。

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

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

相關文章

vuhub Beelzebub靶場攻略

靶場下載&#xff1a; 下載地址&#xff1a;https://download.vulnhub.com/beelzebub/Beelzebub.zip 靶場攻略&#xff1a; 主機發現&#xff1a; nmap 192.168.163.1/24 端口掃描&#xff1a; nmap -p-65535 -A 192.168.163.152 發現沒有額外端口。 頁面掃描&#xff1…

開啟單片機

前言&#xff1a;為未來拼搏的第n天&#xff0c;從單片機開始。為什么要學習單片機呢&#xff0c;單片機的工作涉及范圍及其廣如&#xff1a;消費電子&#xff0c;游戲機音響&#xff1b;工業控制&#xff1a;機器人控制&#xff1b;醫療設備&#xff0c;通信設備&#xff0c;物…

人工智能系列(8)如何實現無監督學習聚類(使用競爭學習)?

案例&#xff1a;鳶尾花數據集的聚類一.聚類簡介神經網絡能夠從輸入數據中自動提取有意義的特征&#xff0c;而競爭學習規則使得單層神經網絡能夠根據相似度將輸入樣本進行聚類&#xff0c;每個聚類由一個輸出神經元代表并作為該類別的“原型”&#xff0c;從而實現對輸入模式的…

Windows安裝mamba全流程(全網最穩定最成功)

windows系統下安裝mamba會遇到各種各樣的問題。博主試了好幾天&#xff0c;把能踩的坑都踩了&#xff0c;總結出了在windows下安裝mamba的一套方法&#xff0c;已經給實驗室的windows服務器都裝上了。只要跟著我的流程走下來&#xff0c;大概率不會出問題&#xff0c;如果遇到其…

Autosar Dem配置-最大存儲的DTC信息個數配置-基于ETAS軟件

文章目錄 前言 Autosar Dem相關配置 ETAS工具中的配置 生成文件分析 測試驗證 總結 前言 診斷DTC開發中,會有故障快照和擴展數據的存儲需求,但由于控制器的可用存儲空間有限,所以無法存儲所有DTC的信息,這時就需要限制存儲的數量,本文介紹該參數在ETAS軟件中的配置。 Au…

【MySQL】EXISTS 與 NOT EXISTS 深度解析:從原理到實戰的完整指南

在復雜的業務查詢中&#xff0c;我們常常需要判斷“是否存在滿足某條件的記錄”或“找出不滿足某些條件的記錄”。這時&#xff0c;EXISTS 和 NOT EXISTS 子查詢便成為強大的工具。它們不僅邏輯清晰、語義明確&#xff0c;而且在某些場景下性能遠超 IN 或 JOIN。然而&#xff0…

面對信號在時頻平面打結,VNCMD分割算法深度解密

“ 信號迷宮中的破壁者&#xff1a;VNCMD如何分解糾纏的時空密碼&#xff1f;——從鯨歌到機械故障&#xff0c;寬帶信號分解新紀元。”01—痛點直擊&#xff1a;為什么傳統方法集體失效&#xff1f;2017年&#xff0c;上海交大團隊提出了一項突破性研究&#xff1a;變分非線性…

CSS優先級、HTTP響應狀態碼

CSS優先級 優先級&#xff1a;看CSS的來源、樣式引入方式、選擇器、源碼順序。 行內樣式/內聯樣式&#xff1a;直接在HTML元素的style屬性中編寫CSS樣式。這種方式適用于少量樣式的情況&#xff0c;但不推薦在大規模開發中使用&#xff0c;因為它會使HTML文件變得冗長和難以維…

項目一系列-第2章 Git版本控制

第2章 Git版本控制 2.1 Git概述 Git是什么&#xff1f;Git是一個分布式版本控制工具&#xff0c;于管理開發過程中的文件。 Git有哪些作用&#xff1f; 遠程備份&#xff1a;Git可以將本地代碼備份到遠程服務器&#xff0c;防止數據丟失。多人協作&#xff1a;Git運行多個開發者…

Java異常:認識異常、異常的作用、自定義異常

目錄1.什么是異常&#xff1f;1&#xff09;運行時異常2&#xff09;編譯時異常2.異常的作用1&#xff09;Java 異常在定位 BUG 中的核心作用2&#xff09;Java 異常作為方法內部特殊返回值的作用3&#xff09;自定義異常1.什么是異常&#xff1f; Error:代表的系統級別錯誤(屬…

第十九天-輸入捕獲實驗

一、輸入捕獲概述1、輸入捕獲框圖2、輸入捕獲工作詳解①設置輸入捕獲濾波器可以設置濾波&#xff0c;濾除一些高電平脈寬不足的脈沖信號。②設置捕獲極性③輸入捕獲映射④輸入捕獲分頻器這里的捕獲是將計數器的值存入比較寄存器中&#xff0c;分頻次的作用是設置幾個上升沿/下降…

多線程問題,子線程同時操作全局變量,使用后需要清空嗎 ?

背景&#xff1a;目前有一個全局變量 &#xff0c;某個方法中通過多線程&#xff0c;都操作這個變量&#xff0c;向這個全局變量中去添加元素&#xff0c;然后等所有子線程執行完了之后&#xff0c;對這個全局變量進行批量保存&#xff0c;然后這個全局變量還需要手動去清空嗎&…

Netty知識儲備:BIO、NIO、Reactor模型

學習Netty之前&#xff0c;首先先掌握這些基礎知識&#xff1a;阻塞&#xff08;Block&#xff09;與非阻塞&#xff08;Non-Block&#xff09;&#xff0c;同步&#xff08;Synchronous&#xff09;與異步&#xff08;Asynchronous&#xff09;&#xff0c;Java BIO與NIO對比。…

用生成器守住架構,用 AI 放大效率:一套可落地的 AI 編程方法論

背景與問題 現實困境: 直接讓 AI 產出整塊業務代碼&#xff0c;常常與現有架構風格、分層邊界、依賴策略不一致&#xff0c;后續改造成本高&#xff1b;AI 對現實業務語境、領域規則難以精準把握&#xff1b;在既定模板成熟的場景下&#xff0c;代碼生成器往往更快、更整齊。目…

碼頭岸電系統如何保障供電安全?安科瑞絕緣監測及故障定位方案解析

當岸電電網是TN-S系統時&#xff0c;船體未接專用接地線且船舶電網未與岸電零線接通&#xff0c;船舶電網發生單相接地故障時&#xff0c;人站在岸上觸及船體會有觸電危險&#xff0c;零線上可能出現高電壓&#xff0c;單相接地電流大。當船體接專用接地線且船舶電網接入岸電零…

ESP32_u8g2移植

前言 U8g2 是一個用于嵌入式設備的單色圖形庫。U8g2支持單色OLED和LCD&#xff0c;并支持如SSD1306 SSD1315等多種類型的OLED驅動&#xff0c;幾乎市面上常見都支持。 U8g2源碼 download&#xff1a;https://github.com/olikraus/u8g21&#xff1a;環境 ESP32 S3(ESP32-S3-Dev…

MCP實現:.Net實現MCP服務端 + Ollama ,MCP服務端工具調用

本文使用.Net編寫MCP服務端 Ollama &#xff0c;實現簡單MCP調用&#xff0c;代碼僅實現基本演示功能。 文章目錄一、Ollama如何安裝使用二、創建.Net8項目&#xff0c;開發MCP服務端三、開發MCP客戶端&#xff0c;并對接Ollama一、Ollama如何安裝使用 請移步&#xff1a;htt…

Docker的安裝使用以及常見的網絡問題

一、什么是DockerDocker是一種容器化技術&#xff0c;用于快速打包、分發和運行程序。他的核心思想是"一次構建&#xff0c;到處運行"&#xff0c;通過將應用及其依賴的環境打包到一個輕量級、可移植的容器中&#xff0c;實現跨平臺一致運行。二、Docker的安裝1.Cent…

C++入門學習

1.命名空間的介紹首先我們看到如下的代碼&#xff0c;在C語言中&#xff1a;#include <stdio.h> #include <stdlib.h> int rand 10; // C語言沒辦法解決類似這樣的命名沖突問題&#xff0c;所以C提出了namespace來解決 int main() {printf("%d\n", rand…

解決python錯誤:playwright._impl._errors.TimeoutError: Timeout 30000ms exceeded.

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page() page.goto(url)page.wait_for_load_state(networkidle) 在Python環境中運行以上代碼后報錯: page.wait_for_load_…