HOWTO · Python

在 Python 中定義類全域性變數

學習在類別主體中定義 Python 類別屬性、用 ClassName.attribute 存取它,並將它與用 global 宣告的模組級名稱區分開來。

本頁內容

Python 類別變數是在類別本體中指定的屬性。只要在類別上定義一次,就能透過 ClassName.attribute 讀取,例如 Tesla.speed。global 名稱則不同:它屬於模組命名空間,不會成為類別屬性。

在 Python 中定義類別變數

在類別本體中指定值,再透過類別名稱讀取。範例也示範如何在方法和另一個類別中讀取相同屬性。

class Tesla:
    speed = 60

    def show_speed(self):
        return Tesla.speed


class Dashboard:
    def show_tesla_speed(self):
        return Tesla.speed


print(Tesla.speed)
print(Tesla().show_speed())
print(Dashboard().show_tesla_speed())
60
60
60

這裡的 speed 儲存在 Tesla 上,因此 Tesla.speed 會讀取共用的類別屬性。Tesla 和 Dashboard 中的方法都使用相同的類別限定查找方式。

在類別外存取類別變數

只要能使用類別,就可以透過 ClassName.attribute 存取屬性。例如,無論在模組層級的程式碼或另一個類別的方法中,都可以使用 Tesla.speed。讀取類別屬性不需要建立實例。在類別外直接使用 speed 這類名稱,並不會指向 Tesla.speed;Python 會在目前的作用域中查找它,而該名稱可能尚未定義。

實例也可以定義同名屬性。例如,car.speed = 80 會在該 car 實例上設定屬性,而 Tesla.speed 仍然指向類別屬性。若要明確取得共用值,請使用類別限定的寫法。

為什麼 global 不會定義類別變數

global 陳述式會告訴 Python,在程式區塊中對不帶限定名稱的變數進行指定時,應將該名稱綁定至模組命名空間。在類別本體中,若先寫 global speed 再寫 speed = 60,建立或更新的是模組層級的名稱 speed,而不是 Tesla.speed。若要定義類別變數,請在類別本體中直接指定值,例如 speed = 60,不要使用 global;在類別外則以 Tesla.speed 存取。

需要使用類別屬性的方法也可以寫 Tesla.speed。若方法需要支援子類別,請依預期的查找行為使用 type(self).speed 或 self.speed;self.speed 可能會讀取遮蔽類別屬性的實例屬性。