靜態(tài)方法

靜態(tài)方法

靜態(tài)方法是一類特殊的方法。有時,需要寫屬于一個類的方法,但是不需要用到對象本身。例如:

class Pizza(object):

@staticmethod

def mix_ingredients(x, y):

return x + y

def cook(self):

return self.mix_ingredients(self.cheese, self.vegetables)

這里將方法mix_ingredients作為一個非靜態(tài)的方法也可以work,但是給它一個self的參數(shù)將沒有任何作用。這兒的decorator@staticmethod帶來一些特別的東西:

>>> Pizza().cook is Pizza().cook

False

>>> Pizza().mix_ingredients is Pizza().mix_ingredients

True

>>> Pizza().mix_ingredients is Pizza.mix_ingredients

True

>>> Pizza()

<__main__.Pizza object at 0x10314b410>

>>> Pizza()

<__main__.Pizza object at 0x10314b510>

>>>

Python不需要對每個實例化的Pizza對象實例化一個綁定的方法。

綁定的方法同樣是對象,創(chuàng)建它們需要付出的代價。這里的靜態(tài)方法避免了這樣的情況:

*降低了閱讀代碼的難度:看到@staticmethod便知道這個方法不依賴與對象本身的狀態(tài);

*允許我們在子類中重載mix_ingredients方法。如果我們使用在模塊最頂層定義的函數(shù)mix_ingredients,一個繼承自Pizza的類若不重載cook,可能不可以改變混合成份(mix_ingredients)的方式。

類方法

類方法是綁定在類而非對象上的方法

>>> class Pizza(object):

... ????radius = 42

... ????@classmethod

... ????def get_radius(cls):

... ????????return cls.radius

...

>>> Pizza.get_radius

>

>>> Pizza().get_radius

>

>>> Pizza.get_radius is Pizza().get_radius

False

>>> Pizza.get_radius()

42

不管如何使用這個方法,它總會被綁定在其歸屬的類上,同時它的第一個參數(shù)是類本身(類同樣是對象)

類方法一般用于下面兩種:

1.工廠方法,被用來創(chuàng)建一個類的實例,完成一些預處理工作。如果使用一個@staticmethod靜態(tài)方法,我們可能需要在函數(shù)中硬編碼Pizza類的名稱,使得任何繼承自Pizza類的類不能使用我們的工廠用作自己的目的。

class Pizza(object):

def __init__(self, ingredients):

self.ingredients = ingredients

@classmethod

def from_fridge(cls, fridge):

return cls(fridge.get_cheese() + fridge.get_vegetables())

2.靜態(tài)方法調(diào)靜態(tài)方法:如果將一個靜態(tài)方法分解為幾個靜態(tài)方法,不需要硬編碼類名但可以使用類方法。使用這種方式來聲明我們的方法,Pizza這個名字不需要直接被引用,并且繼承和方法重載將會完美運作。

class Pizza(object):

def __init__(self, radius, height):

self.radius = radius

self.height = height

@staticmethod

def compute_circumference(radius):

return math.pi * (radius ** 2)

@classmethod

def compute_volume(cls, height, radius):

return height * cls.compute_circumference(radius)

def get_volume(self):

return self.compute_volume(self.height, self.radius)

TMR????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容