首頁  >  文章  >  後端開發  >  Python - 如何在類別中定義公有、私有和受保護變數

Python - 如何在類別中定義公有、私有和受保護變數

WBOY
WBOY原創
2024-09-12 10:22:19929瀏覽

Python -How to define public, private and protected variables in a class

介紹

Python 作為一種物件導向的程式語言,提供了多種將資料封裝在類別中的方法。
這種封裝的關鍵方面之一是類別變數的可見性,可以將其分為公共變數、受保護變數和私有變數。在本文中,我們將探討如何在 Python 類別中定義公有、私有和受保護變數。

這些變數的行為與其他程式語言非常不同。這些存取控制只是Python中的命名約定,而不是物件的實際隱藏。

1. 公共變數

公共變數是最容易存取的變數類型。可以從課堂內外的任何地方存取它們。在Python中,除非明確定義,否則所有類別變數預設都是公共的。

範例:

class MyClass:
    def __init__(self, name):
        self.name = name  # Public variable

obj = MyClass("John")
print(obj.name)  # Accessible outside the class
#Output : John

在此範例中,name 是一個公共變數。您可以從類外存取和修改它,沒有任何限制。

2. 受保護的變數

受保護的變數只能在類別及其子類別中存取。雖然 Python 不強制執行嚴格的存取控制,但表示變數受保護的約定是在其名稱前面加上一個底線 (_)。

範例:

class MyClass:
    def __init__(self, name, age):
        self._age = age  # Protected variable

class ChildClass(MyClass):
    def display(self):
        print(f"Age: {self._age}")  # Accessible within a subclass

obj = ChildClass("John", 30)
obj.display()  
# Output: Age: 30

在此範例中,年齡是受保護的變數。雖然 Python 不會阻止您直接在類別外部存取它,但這樣做違反了預期用途。

3. 私有變數

私有變數只能在定義它們的類別中存取。 Python 在變數名前加上雙底線 (__) 來表示私有變數。這會觸發名稱修改,使從類別外部存取私有變數變得更加困難(但並非不可能)。

範例:

class MyClass:
    def __init__(self, name, age, salary):
        self.__salary = salary  # Private variable

    def display_salary(self):
        print(f"Salary: {self.__salary}")  # Accessible within the class

obj = MyClass("John", 30, 50000)
obj.display_salary()  # Output: Salary: 50000

# Trying to access the private variable outside the class
print(obj.__salary)  # Raises AttributeError

在這個例子中,salary 是一個私有變數。如果您嘗試直接從類別外部存取它,Python 將引發 AttributeError。但是,您仍然可以使用名稱損壞的版本來存取它,儘管不鼓勵這樣做。

名稱修改範例:

print(obj._MyClass__salary)  # Output: 50000

這行程式碼示範如何在內部重命名私有變數以包含類別名稱,使它們更難以存取。

概括

  • 公共變數:可從任何地方存取;沒有底線。
  • 受保護的變數:在類別及其子類別中可存取;以單一底線 (_) 為前綴。
  • 私有變數:只能在類別內部存取;以雙底線 (__) 為前綴。

雖然 Python 的存取控制是基於命名約定而不是嚴格執行,但遵循這些約定有助於保持程式碼的清晰度和完整性。了解如何定義和使用公共變數、受保護變數和私有變數對於 Python 中有效的物件導向程式設計至關重要。

以上是Python - 如何在類別中定義公有、私有和受保護變數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn