靜態(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????