Python - 類屬性



在類中定義的屬性或變數稱為屬性。屬性提供有關類包含的資料型別的資訊。Python 中有兩種型別的屬性,即例項屬性類屬性

例項屬性是在 Python 類的建構函式中定義的,並且對於類的每個例項都是唯一的。並且,類屬性在類的建構函式外部宣告和初始化。

類屬性(變數)

類屬性是屬於類的變數,其值在該類的所有例項之間共享。對於類的每個例項,類屬性保持不變。

類屬性在類中但不在任何方法中定義。它們不能在 __init__() 建構函式中初始化。除了物件之外,還可以透過類名來訪問它們。換句話說,類屬性可用於類及其物件。

訪問類屬性

物件名稱後跟點符號 (.) 用於訪問類屬性。

示例

以下示例演示瞭如何訪問 Python 類的屬性。

class Employee:
   name = "Bhavesh Aggarwal"
   age = "30"

# instance of the class
emp = Employee()
# accessing class attributes
print("Name of the Employee:", emp.name)
print("Age of the Employee:", emp.age)

輸出

Name of the Employee: Bhavesh Aggarwal
Age of the Employee: 30

修改類屬性

要修改類屬性的值,我們只需使用類名稱後跟點符號和屬性名稱為其分配一個新值。

示例

在以下示例中,我們正在 Employee 類中初始化一個名為 empCount 的類變數。對於宣告的每個物件,都會自動呼叫 __init__() 方法。此方法初始化例項變數,並將 empCount 加 1。

class Employee:
   # class attribute    
   empCount = 0
   def __init__(self, name, age):
      self.__name = name
      self.__age = age
      # modifying class attribute
      Employee.empCount += 1
      print ("Name:", self.__name, ", Age: ", self.__age)
      # accessing class attribute
      print ("Employee Count:", Employee.empCount)

e1 = Employee("Bhavana", 24)
print()
e2 = Employee("Rajesh", 26)

輸出

我們聲明瞭兩個物件。每次,empCount 都加 1。

Name: Bhavana , Age:  24
Employee Count: 1

Name: Rajesh , Age:  26
Employee Count: 2

類屬性的意義

類屬性之所以重要,原因如下:

  • 它們用於定義類的那些屬性,這些屬性應該對該類的每個物件都具有相同的值。
  • 類屬性可用於為物件設定預設值。
  • 這對於建立單例也很有用。它們是僅例項化一次並在程式碼的不同部分使用的物件。

內建類屬性

每個 Python 類都保留以下 內建屬性,並且可以使用點運算子像任何其他屬性一樣訪問它們:

  • __dict__ - 包含類名稱空間的字典。

  • __doc__ - 類文件字串或無,如果未定義。

  • __name__ - 類名。

  • __module__ - 定義類的模組名稱。此屬性在互動模式下為 "__main__"。

  • __bases__ - 一個可能為空的元組,包含基類,按照其在基類列表中出現的順序排列。

訪問內建類屬性

要在 Python 中訪問內建類屬性,我們使用類名稱後跟一個點 (.),然後是屬性名稱。

示例

對於 Employee 類,我們嘗試訪問所有內建類屬性:

class Employee:
   def __init__(self, name="Bhavana", age=24):
      self.name = name
      self.age = age
   def displayEmployee(self):
      print ("Name : ", self.name, ", age: ", self.age)

print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )

輸出

它將產生以下輸出:

Employee.__doc__: None
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {'__module__': '__main__', '__init__': <function Employee.__init__ at 0x0000022F866B8B80>, 'displayEmployee': <function Employee.displayEmployee at 0x0000022F866B9760>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>, '__doc__': None}

例項屬性

如前所述,Python 中的 例項屬性 是特定於類的單個物件的變數。它在 __init__() 方法中定義。

此方法的第一個引數是 self,並使用此引數定義例項屬性。

示例

在以下程式碼中,我們說明了例項屬性的工作原理。

class Student:
   def __init__(self, name, grade):
      self.__name = name
      self.__grade = grade
      print ("Name:", self.__name, ", Grade:", self.__grade)

# Creating instances 
student1 = Student("Ram", "B")
student2 = Student("Shyam", "C")

輸出

執行以上程式碼後,將產生以下輸出:

Name: Ram , Grade: B
Name: Shyam , Grade: C

例項屬性與類屬性

下表顯示了例項屬性和類屬性之間的區別:

序號 例項屬性 類屬性

1 它是在 `__init__()` 函式內部直接定義的。 它是在類內部但 `__init__()` 函式外部定義的。
2 例項屬性使用物件名稱後跟點表示法訪問。 類屬性既可以透過類名訪問,也可以透過物件名訪問。
3 此屬性的值不能在其他物件之間共享。 它的值在類的其他物件之間共享。
4 對例項屬性所做的更改僅影響定義它的物件。 對類屬性所做的更改會影響給定類中的所有物件。
廣告