1. 程式人生 > 其它 >Python 靜態方法-例項方法語法及作用區別簡析

Python 靜態方法-例項方法語法及作用區別簡析

技術標籤:python程式語言class

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()

應用場景

  1. 獲取和類相關的資訊並且可以創建出類的物件。
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)
  1. 精簡程式碼,比如呼叫類中靜態方法。使用靜態方法呼叫另一個靜態方法需要寫上類的名字,而類名一旦修改,則程式碼也需要改動。
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。引數隨意,沒有selfcls引數,但是方法體中不能使用類或例項的任何屬性和方法。
    • 呼叫:例項物件和類物件都可以呼叫。