檢查 Python 物件是否具有某屬性

Shikha Chaudhary 2023年1月30日 2022年5月17日
  1. 在 Python 中使用 hasattr() 方法檢查屬性
  2. 在 Python 中使用 getattr() 函式檢查屬性
檢查 Python 物件是否具有某屬性

物件導向的程式設計圍繞類和物件的概念展開。

每個類都有可以稱為屬性的方法和屬性。一個物件可以獲取一個類的屬性,每個物件也可以有它的屬性。瞭解物件具有哪些屬性是必要的。

無法在大量程式碼中手動檢查物件中的屬性。本文將展示檢查物件屬性的不同方法。

在 Python 中使用 hasattr() 方法檢查屬性

hasattr() 函式檢查物件是否具有特定屬性。如果函式找到屬性,則返回 true;否則,它返回 false

語法:

hasattr(object_name, attribute_name)

這個函式有兩個引數——物件的名稱和我們要檢查的屬性。該函式根據是否找到屬性將輸出作為布林值 truefalse 給出。

假設我們有一個名為 Cake 的類。我們在這個類中定義了三個屬性——best_cakebest_flavorcost。然後,我們建立 cake_object 作為此類的物件。

現在,要檢查該物件是否具有屬性 best_cake,我們使用 hasattr() 方法。將類的名稱和此屬性作為引數傳遞給此函式。

class Cake:
    best_cake = "Choco Lava"
    best_flavor = "Vanilla"
    cost = 2500
    
cake_object = Cake()
print(hasattr(Cake, 'best_cake'))

輸出:

True

由於 best_cake 屬性屬於物件 cake_object,我們得到 True 作為輸出。

現在看看如果我們將 quantity 作為屬性名稱會發生​​什麼。

class Cake:
    best_cake = "Choco Lava"
    best_flavor = "Vanilla"
    cost = 2500
    
cake_object = Cake()
print(hasattr(Cake, 'quantity'))

輸出:

False

由於屬性 quantity 不存在,我們得到 False 作為輸出。

在 Python 中將 hasattr() 函式與 If-Else 塊一起使用

另一種使用 hasattr() 函式的方法是將它與 if-else 塊一起使用。當屬性存在時,hasattr() 函式返回 true

因此,if 塊執行並列印屬性的值。但是,如果該屬性不存在,則返回的值將是 false,然後執行 else 塊。

class Cake:
    best_cake = "Choco Lava"
    best_flavor = "Vanilla"
    cost = 2500
    
cake_object = Cake()
if hasattr(Cake, 'quantity'):
    print(Cake.quantity)
else:
    print("Whoops, no such attribute exists!")

輸出:

Whoops, no such attribute exists!

我們在 if 塊內搜尋屬性。由於該屬性不存在,該函式返回 false 並進入 else 塊。在 else 塊中,我們指定一個簡單的列印語句作為輸出。

在 Python 中使用 getattr() 函式檢查屬性

getattr() 函式在屬性不存在時返回預設值。getattr() 函式的工作方式與前一個相同。

語法:

getattr(object_name, attribute_name, default_value)

getattr() 函式接受三個引數 - 物件、屬性和屬性不存在時的預設值。

比如說,我們必須找到 cake_object 物件的 quantity 屬性。在不指定預設引數的情況下,讓我們使用 getattr() 函式。

class Cake:
    best_cake = "Choco Lava"
    best_flavor = "Vanilla"
    cost = 2500
    
cake_object = Cake()
print(getattr(Cake, 'quantity'))

輸出:

AttributeError: type object 'Cake' has no attribute 'quantity'

getattr() 函式在這裡丟擲異常。

現在,讓我們指定一個在屬性不存在時應該列印的預設引數。這個預設引數可以是一個簡單的訊息。

class Cake:
    best_cake = "Choco Lava"
    best_flavor = "Vanilla"
    cost = 2500
    
cake_object = Cake()
print(getattr(Cake, 'quantity', 'Attribute not found'))

輸出

Attribute not found

我們從預設引數而不是任何異常或錯誤中獲取訊息。

Getattr() 函式與 Try-Except 塊一起使用

還有另一種使用 getattr() 函式的方法。使用 try-catch 塊來檢查屬性的存在。這個想法是在 try 塊中包含 getattr() 函式。

如果該屬性存在,我們將列印其值。否則,將丟擲 AttributeError。我們可以在 catch 塊中處理此異常並使用 print 語句列印錯誤訊息。

在本例中,我們在 try 塊中搜尋 quantity 屬性。我們沒有在 getattr() 函式中指定預設引數。

這是因為我們在 except 塊內處理錯誤。

class Cake:
    best_cake = "Choco Lava"
    best_flavor = "Vanilla"
    cost = 2500
    
cake_object = Cake()
try:
    print(getattr(Cake, 'quantity'))
except AttributeError:
    print("Whoops, this attribute is not present!")

輸出:

Whoops, this attribute is not present!

我們不能像 getattr() 函式那樣將 hasattr() 函式與 try-catch 塊一起使用。這是因為 hasattr() 函式返回布林值而不是異常。

總結

我們討論了在 Python 中查詢屬性是否存在於物件中。我們使用了兩個函式 - hasattr()getattr() 來實現這一點。

我們學會了將 hasattr() 函式與 if-else 塊以及 getattr() 函式與 try-except 塊結合。

相關文章 - Python Object