Python 靜態方法-例項方法語法及作用區別簡析
阿新 • • 發佈:2021-01-08
Python 中有很多方法:例項方法(instance method),類方法(class method)與靜態方法(static method)。本文從語法及用途上做一些簡單對比。
語法區別
class HornHub:
paied_users = 100
def __init__(self):
pass
def display(self, vid:str):
print(vid)
@classmethod
def get_revenue(cls):
return cls.paied_users * 10
@staticmethod
def print_something(msg:str):
pass
例項方法
例項方法最少也要包含一個 self
引數(self
只是一個變數名,可以用其他名稱命令),用於繫結呼叫此方法的例項物件(Python 會自動完成繫結)。例項方法通常會用類物件直接呼叫。例如:
obj = HornHub()
obj.display(123)
類方法
Python 類方法和例項方法相似,它最少也要包含一個引數,通常將其命名為 cls,Python 會自動將類本身繫結給 cls
引數(注意,繫結的不是類物件)。也就是說,我們在呼叫類方法時,無需顯式為 cls
和例項方法最大的不同在於,類方法需要使用 @classmethod
裝飾器進行裝飾。如果沒有這個裝飾器,則直譯器會將方法解釋為例項方法。
類方法推薦使用類名直接呼叫,當然也可以使用例項物件來呼叫(不推薦)。
HornHub.get_revenue()
應用場景
- 獲取和類相關的資訊並且可以創建出類的物件。
class Book(object):
def __init__(self, title):
self.title = title
@classmethod
def create(cls, title):
book = cls( title=title)
return book
book1, book2 = Book("python"), Book.create("python and django")
print(book1.title, book2.title)
- 精簡程式碼,比如呼叫類中靜態方法。使用靜態方法呼叫另一個靜態方法需要寫上類的名字,而類名一旦修改,則程式碼也需要改動。
class Foo(object):
X, Y = 1, 2
@staticmethod
def averag(*mixes):
return sum(mixes) / len(mixes)
@staticmethod
def static_method():
return Foo.averag(Foo.X, Foo.Y)
@classmethod
def class_method(cls):
return cls.averag(cls.X, cls.Y)
foo = Foo()
print(foo.static_method())
print(foo.class_method())
靜態方法
靜態方法本質上即是一個函式,和普通函式的區別在於,靜態方法定義在類這個空間(類名稱空間)中,而函式則定義在程式所在的空間(全域性名稱空間)中。
它的用途是:有時候我們需要定義一些跟類有關的方法,但在實現時並不需要引用類或者例項,例如,設定環境變數,修改另一個類的變數等。這個時候,我們可以使用靜態方法。 靜態方法採用裝飾器 @staticmethod
來定義。
上例中的 print_something()
用於列印資訊,不需要呼叫類或者例項。對於靜態方法,Python 並不需要傳遞類或者例項,因此,既可以使用類也可以使用例項來呼叫靜態方法。
小結
-
例項方法
- 定義:第一個引數必須是例項物件,該引數名一般約定為
self
,通過它來傳遞例項的屬性和方法(也可以傳類的屬性和方法)。 - 呼叫:只能由例項物件呼叫。
- 定義:第一個引數必須是例項物件,該引數名一般約定為
-
類方法
- 定義:使用裝飾器
@classmethod
。第一個引數必須是當前類物件,該引數名一般約定為cls
,通過它來傳遞類的屬性和方法(不能傳例項的屬性和方法)。 - 呼叫:例項物件和類物件都可以呼叫。
- 定義:使用裝飾器
-
靜態方法
- 定義:使用裝飾器
@staticmethod
。引數隨意,沒有self
和cls
引數,但是方法體中不能使用類或例項的任何屬性和方法。 - 呼叫:例項物件和類物件都可以呼叫。
- 定義:使用裝飾器