1. 程式人生 > 程式設計 >淺談python 類方法/靜態方法

淺談python 類方法/靜態方法

1.類方法

類方法是從屬於"類物件"的方法。類物件可以通過裝飾器@classmethod來定義,具體格式如下:

@classmethod
def 類方法名(cls [,形參列表]):
	方法體

要點如下:

  1. @classmethod必須位於方法的上面一行
  2. 第一個引數cls(class的縮寫,和前面筆記介紹的self類似),必須要有,代指"類物件"本身。
  3. 呼叫類方法格式:類名.類方法名(引數列表)。引數列表中不需要也不能給cls引數進行傳值,直譯器會自動賦值。
  4. 類方法中可以訪問例項屬性和例項方法會導致錯誤,因為有類不一定有物件。
  5. 子類繼承父類方法時,傳入cls是自身物件,而非父類物件。(後面的筆記會有介紹)

程式碼示例:

class Student:
  count = 0    # 類屬性

  """定義方法"""
  @classmethod
  def print_count(cls):
    """cls引數代表類物件"""
    print(Student.count)


"""呼叫類方法"""
print("呼叫時,不傳遞cls引數")
Student.print_count()

執行結果:

呼叫時,不傳遞cls引數
0

2.靜態方法

在python中,允許定義於”類物件“無關的方法,稱為"靜態方法"。
"靜態方法"和在模組中定義的普通方法沒有什麼區別,只不過"靜態方法"放到了"類的名字變數空間",需要通過類呼叫。

靜態方法通過裝飾器@staticmethod來定義,格式如下:

@staticmethod
def 靜態方法名([形參列表]):
	方法體

要點如下:

  1. @staticmethod必須位於方法上面一行
  2. 呼叫靜態方法格式:類名.靜態方法名(引數列表)
  3. 靜態方法中訪問例項屬性和例項方法會導致錯誤

程式碼示例:

class Student:
  count = 0      # 類屬性

  @staticmethod
  def add(a,b):
    """與類無關的靜態方法"""
    """因為靜態方法從屬於類,所以是可以操作類屬性和類方法"""
    print("{0}+{1}={2}".format(a,b,a+b))
    return a + b


# 呼叫靜態方法
Student.add(20,30)

執行結果:

20+30=50
res=50

3.例項方法/類方法/靜態方法的區別

class MyClass:
  # 類屬性
  class_attr = 0

  def __init__(self,obj_attr):
    self.obj_attr = obj_attr

  def instance_method(self):
    return "instance method called",self

  @classmethod
  def class_method(cls):
    return "class method called",cls

  @staticmethod
  def static_method():
    return "static method called"


print("呼叫例項方法")
obj1 = MyClass("obj_attr1")
print(obj1.instance_method())

print("--" * 20)
print("呼叫類方法")
print(MyClass.class_method())

print("--" * 20)
print("呼叫靜態方法")
print(MyClass.static_method())

執行結果:

呼叫例項方法
('instance method called',<__main__.MyClass object at 0x10ca93310>)
----------------------------------------
呼叫類方法
('class method called',<class '__main__.MyClass'>)
----------------------------------------
呼叫靜態方法
static method called

注意: 以下討論的屬性、方法均指公開的型別,非私有的。

例項方法:

  1. 能讀取、修改例項屬性
  2. 能呼叫例項方法
  3. 能讀取、修改類屬性
  4. 能呼叫類方法
  5. 能呼叫類靜態方法
  6. 呼叫方式:物件名.例項方法名(引數列表),編譯器自動傳遞self引數

類方法:

  1. 不能讀取、修改例項屬性
  2. 不能用例項方法
  3. 能讀取、修改類屬性
  4. 能呼叫類方法
  5. 能呼叫類靜態方法
  6. 呼叫方式:類名.類方法名(引數列表),編譯器自動傳遞cls引數

靜態方法:

  1. 不能讀取、修改例項屬性
  2. 不能用例項方法
  3. 能讀取、修改類屬性
  4. 能呼叫類方法
  5. 能呼叫類靜態方法
  6. 呼叫方式: 類名.靜態方法名(引數列表),不需要cls引數
  7. 類方法和靜態方法,功能非常相近,可以相互替代, 但是從規範的角度來說,請按照例項方法操作物件,類方法操作類,靜態方法為和類無關的通用方法。

以上就是淺談python 類方法/靜態方法的詳細內容,更多關於類方法/靜態方法的資料請關注我們其它相關文章!