Python - 類方法



方法屬於類的物件,用於執行特定操作。我們可以將 Python 方法分為三類:類方法、例項方法和靜態方法。

Python 的類方法是一種繫結到類而不是類例項的方法。它可以在類本身而不是類的例項上呼叫。

我們大多數人經常將類方法與靜態方法混淆。記住,雖然兩者都在類上呼叫,但靜態方法無法訪問“cls”引數,因此它無法修改類狀態。

與類方法不同,例項方法可以訪問物件的例項變數。它還可以訪問類變數,因為類變數對所有物件都是通用的。

在 Python 中建立類方法

在 Python 中建立類方法有兩種方法:

  • 使用 classmethod() 函式
  • 使用 @classmethod 裝飾器

使用 classmethod() 函式

Python 有一個內建函式classmethod(),它可以將例項方法轉換為類方法,該類方法只能用類引用呼叫,而不能用物件呼叫。

語法

classmethod(instance_method)

示例

在 Employee 類中,定義一個帶有“self”引數(對呼叫物件的引用)的 showcount() 例項方法。它列印 empCount 的值。接下來,將該方法轉換為可以透過類引用訪問的類方法 counter()。

class Employee:
   empCount = 0
   def __init__(self, name, age):
      self.__name = name
      self.__age = age
      Employee.empCount += 1
   def showcount(self):
      print (self.empCount)
      
   counter = classmethod(showcount)

e1 = Employee("Bhavana", 24)
e2 = Employee("Rajesh", 26)
e3 = Employee("John", 27)

e1.showcount()
Employee.counter()

輸出

使用物件呼叫 showcount(),使用類呼叫 count(),兩者都顯示員工計數的值。

3
3

使用 @classmethod 裝飾器

使用@classmethod()裝飾器是定義類方法的首選方法,因為它比先宣告例項方法然後將其轉換為類方法更方便。

語法

@classmethod
def method_name():
   # your code

示例

類方法充當備選建構函式。定義一個帶有構造新物件所需引數的newemployee()類方法。它返回構造的物件,這與__init__()方法的作用相同。

class Employee:
    empCount = 0
    def __init__(self, name, age):
        self.name = name
        self.age = age
        Employee.empCount += 1

    @classmethod
    def showcount(cls):
        print (cls.empCount)

    @classmethod
    def newemployee(cls, name, age):
        return cls(name, age)

e1 = Employee("Bhavana", 24)
e2 = Employee("Rajesh", 26)
e3 = Employee("John", 27)
e4 = Employee.newemployee("Anil", 21)

Employee.showcount()

現在有四個 Employee 物件。如果我們執行上述程式,它將顯示 Employee 物件的計數:

4

在類方法中訪問類屬性

類屬性是屬於類並且其值在該類的所有例項之間共享的那些變數。

要在類方法中訪問類屬性,請使用cls 引數,後跟點 (.) 表示法和屬性的名稱。

示例

在這個例子中,我們在類方法中訪問類屬性。

class Cloth:
   # Class attribute
   price = 4000

   @classmethod
   def showPrice(cls):
      return cls.price

# Accessing class attribute
print(Cloth.showPrice())  

執行上述程式碼後,將顯示以下輸出:

4000

動態地向類新增類方法

Python 的 setattr() 函式用於動態設定屬性。如果要向類新增類方法,請將方法名稱作為引數值傳遞給 setattr() 函式。

示例

以下示例演示如何動態地向 Python 類新增類方法。

class Cloth:
   pass

# class method
@classmethod
def brandName(cls):
   print("Name of the brand is Raymond")

# adding dynamically
setattr(Cloth, "brand_name", brandName)
newObj = Cloth()
newObj.brand_name()

執行以上程式碼後,將顯示以下輸出:

Name of the brand is Raymond

動態刪除類方法

Python 的 del 運算子用於動態刪除類方法。如果嘗試訪問已刪除的方法,程式碼將引發 AttributeError。

示例

在下面的示例中,我們使用 del 運算子刪除名為“brandName”的類方法。

class Cloth:
   # class method
   @classmethod
   def brandName(cls):
      print("Name of the brand is Raymond")

# deleting dynamically
del Cloth.brandName
print("Method deleted")

執行以上程式碼後,將顯示以下輸出:

Method deleted
廣告