HOWTO · Python

在 Python 中列印物件的屬性

本文介紹如何在 Python 中列印物件的屬性。

本頁內容

若要列印已知的屬性,可用點記法存取它,再將值傳給 print()。如果屬性名稱存放在字串中,請使用 getattr();若要檢視已儲存的實例屬性,可在物件提供此功能時使用 __dict__ 或 vars();若要探索 Python 為物件公開的名稱,則可使用 dir()。這些方法呈現的是物件的不同資訊,請依需求選擇:讀取單一值、查看實例屬性對應表,或列出較廣泛的名稱。

Person 類別可以定義類別屬性,而每個物件也能各自儲存實例屬性。以下範例會建立一個具有姓名、年齡和城市的物件。

在 Python 中使用 print 和屬性存取列印物件屬性

已知屬性名稱時,使用點記法是最直接的讀取方式。將屬性值傳給內建的 print() 函式即可:

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(person.name)
John Doe

這個運算式會讀取此實例的 name,並將值寫入標準輸出。

在 Python 中使用 getattr 函式列印物件屬性

當屬性名稱存放在變數中,或要在程式執行時才決定時,可以使用 getattr()。它的第二個引數必須是字串。可選的第三個引數是備用值:找不到該名稱時會回傳此值;若省略備用值,找不到屬性就會引發 AttributeError。

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attribute_name = "city"
city = getattr(person, attribute_name, "Unknown")
print(city)
New York

修改 attribute_name 即可選取其他屬性,也可以依應用程式的需求調整預設值。若不提供第三個引數,名稱不存在時會引發 AttributeError。

在 Python 中使用 __dict__ 屬性列印物件屬性

如果實例有提供 __dict__,它就是該實例的屬性對應表。其中包含儲存在實例上的屬性,例如 __init__ 中指派給 self.name 的值;只有在類別上定義的屬性則不會列在其中。

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attributes = person.__dict__
print(attributes["name"])
John Doe

有些物件沒有實例 __dict__,例如使用 __slots__ 且未提供字典的類別實例,因此這種做法並不適用於所有物件。

在 Python 中使用 dir() 函式列印物件屬性

呼叫 dir(person) 會取得 Python 提供檢視的一份名稱排序清單。清單可能包含實例屬性、類別屬性、方法和特殊名稱;它並非只列出實例中實際儲存的資料。若清單很長,可使用標準函式庫中的 pprint() 函式,以較易閱讀的格式顯示:

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print("name" in dir(person))
True

這項檢查示範 name 是物件公開名稱之一。實際名稱會依物件及其類別而異,自訂的 __dir__() 也可能影響 dir() 的回傳結果。因此,應把它視為探索名稱的工具,而非實例字典的快照。若要以易讀格式檢視完整清單,可將 dir(person) 傳給 pprint() 函式。

在 Python 中使用 vars() 函式列印物件屬性

若物件有提供 __dict__,vars(person) 會回傳相同的實例屬性對應表。你可以將這份對應表傳給 pprint(),方便閱讀:

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(vars(person)["name"])
John Doe

不帶引數呼叫 vars() 用途不同:它會回傳目前的區域符號表。若傳入的物件沒有 __dict__,就會引發 TypeError。因此,只有在需要取得實例對應表,且確定物件有提供該屬性時,才使用這個函式。若要以易讀格式檢視完整對應表,可將 vars(person) 傳給 pprint() 函式。

結論

請依需求選擇檢視方式:已知單一值時,用點記法搭配 print();屬性名稱是動態值時,用 getattr();物件有提供字典時,用 __dict__ 或 vars() 查看已儲存的實例屬性;若要探索更多名稱,則用 dir()。請記得,dir() 可能列出方法和特殊名稱,而實例字典只包含該實例儲存的屬性。