1、例項方法
例項方法既可以呼叫靜態方法也可以呼叫類方法。
# 定義一個類
class A(object):
# 類屬性
count = 0
def __init__(self):
self.name = '孫悟空'
# 例項方法
# 在類中定義,以self為第一個引數的方法都是例項方法
# 例項方法在呼叫時,Python會將呼叫物件作為self傳入
# 例項方法可以通過例項和類去呼叫
# 當通過例項呼叫時,會自動將當前呼叫物件作為self傳入
# 當通過類呼叫時,不會自動傳遞self,此時我們必須手動傳遞self
def test(self):
print('這是test方法~~~ ' , self)
# 建立A類物件
a = A()
# 通過物件呼叫test方法
a.test()
# 通過類直接呼叫test方法
# 需要手動傳入一個物件
A.test(a)
# 所以# a.test() 等價於 A.test(a)
2、類方法
(1)類方法特點
- 在類內部使用
@classmethod
來修飾的方法屬於類方法。 - 對於類方法,第一個引數必須是類物件,一般以
cls
作為第一個引數,就是class
的簡寫。
(2)類方法使用場景
- 當方法中 需要使用類物件 (如訪問私有類屬性等)時,定義類方法。
- 類方法一般和類屬性配合使用。
# 定義一個類
class A(object):
# 類屬性
count = 0
__age = 18
def __init__(self):
self.name = '孫悟空'
# 例項方法
# 在類中定義,以self為第一個引數的方法都是例項方法
# 例項方法在呼叫時,Python會將呼叫物件作為self傳入
# 例項方法可以通過例項和類去呼叫
# 當通過例項呼叫時,會自動將當前呼叫物件作為self傳入
# 當通過類呼叫時,不會自動傳遞self,此時我們必須手動傳遞self
def test(self):
print('這是test方法~~~ ', self)
# 類方法
# 在類內部使用 @classmethod 來修飾的方法屬於類方法
# 類方法的第一個引數是cls,也會被自動傳遞,cls就是當前的類物件
# 類方法和例項方法的區別,例項方法的第一個引數是self,而類方法的第一個引數是cls
# 類方法可以通過類去呼叫,也可以通過例項呼叫,沒有區別
@classmethod
def test_2(cls):
# cls就是當前所在類的類物件
print('這是test_2方法,他是一個類方法~~~ ', cls)
# 可以通過cls直接呼叫類中的類屬性
print(cls.count)
return cls.__age
# 建立A類物件
a = A()
# 通過物件呼叫test_2方法
a.test_2()
# 通過類直接呼叫test_2方法
A.test_2()
# A.test_2() 等價於 a.test_2()
3、靜態方法
(1)靜態方法特點
- 在類中使用
@staticmethod
來修飾的方法屬於靜態方法,靜態方法既不需要傳遞類物件也不需要傳遞例項物件(形參沒有self/cls
),如果有需要,需要什麼引數,就填寫什麼引數就可以。 - 靜態方法 也能夠通過 例項物件 和 類物件 去訪問。
(2)靜態方法使用場景
- 當方法中 既不需要使用例項物件(如例項物件,例項屬性),也不需要使用類物件 (如類屬性、類方法、建立例項等)時,定義靜態方法。
- 取消不需要的引數傳遞,有利於 減少不必要的記憶體佔用和效能消耗。
# 定義一個類
class A(object):
# 類屬性
count = 0
def __init__(self):
self.name = '孫悟空'
# 例項方法
# 在類中定義,以self為第一個引數的方法都是例項方法
# 例項方法在呼叫時,Python會將呼叫物件作為self傳入
# 例項方法可以通過例項和類去呼叫
# 當通過例項呼叫時,會自動將當前呼叫物件作為self傳入
# 當通過類呼叫時,不會自動傳遞self,此時我們必須手動傳遞self
def test(self):
print('這是test方法~~~ ', self)
# 類方法
# 在類內部使用 @classmethod 來修飾的方法屬於類方法
# 類方法的第一個引數是cls,也會被自動傳遞,cls就是當前的類物件
# 類方法和例項方法的區別,例項方法的第一個引數是self,而類方法的第一個引數是cls
# 類方法可以通過類去呼叫,也可以通過例項呼叫,沒有區別
@classmethod
def test_2(cls):
# cls就是當前所在類的類物件
print('這是test_2方法,他是一個類方法~~~ ', cls)
# 可以通過cls直接呼叫類中的類屬性
print(cls.count)
# 靜態方法
# 在類中使用 @staticmethod 來修飾的方法屬於靜態方法
# 靜態方法不需要指定任何的預設引數,
# 靜態方法可以通過類和例項去呼叫。
# 靜態方法,基本上是一個和當前類無關的方法,它只是一個儲存到當前類中的函式
# 靜態方法一般都是一些工具方法。
@staticmethod
def test_3():
print('test_3執行了~~~')
# 建立A類物件
a = A()
# 通過物件呼叫test_3方法
a.test_3()
# 通過類直接呼叫test_3方法
A.test_3()
# A.test_3() 等價於 a.test_3()
"""
靜態方法和函式的區別:
靜態方法必須要用類物件或者例項物件來呼叫。
函式直接使用。
"""