首先回顧一下Python OOP常見的三種方法:python
標準書寫方式以下:git
class MyClass: def method(self): return 'instance method called', self @classmethod def classmethod(cls): return 'class method called', cls @staticmethod def staticmethod(): return 'static method called'
咱們最經常使用的其實就是普通的接口方法,其餘兩個須要用相似裝飾器的寫法來標註。github
類方法接受一個cls做爲參數,它是指向MyClass自己的,並非MyClass所建立的實例。測試
靜態方法不接受self或者cls做爲參數,因此不會修改類自己或者實例網站
看一下如何使用類方法,新建一個Pizza類,主要參數爲原料ingredientscode
class Pizza: def __init__(self, ingredients): self.ingredients = ingredients def __repr__(self): return f'Pizza({self.ingredients !r})'
新建一個實例測試一下:接口
Pizza(['cheese', 'tomatoes']) Out: Pizza(['cheese', 'tomatoes'])
測試成功。
如今問題來了,既然是Pizza類,會有不一樣口味的Pizza,他們的配方都是固定的,那麼如何便捷的生成不一樣口味的Pizza呢,答案就是classmethodci
class Pizza: def __init__(self, ingredients): self.ingredients = ingredients def __repr__(self): return f'Pizza({self.ingredients!r})' @classmethod def margherita(cls): return cls(['mozzarella', 'tomatoes']) @classmethod def prosciutto(cls): return cls(['mozzarella', 'tomatoes', 'ham'])
類方法能夠根據需求事先預約義生成的實例,減小了代碼量,這裏咱們根據margherita和prosciutto兩種口味pizza的原料提早準備好了,cls就是表明類自己,這樣若是咱們再生成一些實例時,會方便不少:get
#生成一個margherita口味的pizza m = Pizza.margherita() m Out:Pizza(['mozzarella', 'tomatoes'])
#生成一個prosciutto口味的pizza p = Pizza.prosciutto() p Out:Pizza(['mozzarella', 'tomatoes', 'ham'])
那麼何時用靜態方法呢? 好比還用這個例子,我想計算pizza的面積:博客
import math class Pizza: def __init__(self, radius, ingredients): self.radius = radius self.ingredients = ingredients def __repr__(self): return (f'Pizza({self.radius!r}, ' f'{self.ingredients!r})') def area(self): return self.circle_area(self.radius) @staticmethod def circle_area(r): return r ** 2 * math.pi
這種狀況下使用一個靜態方法是一個好的選擇,經過area這個普通的接口方法,能夠調用circle_area來計算面積,封裝性更好:
p = Pizza(4, ['mozzarella', 'tomatoes']) p.area() Out: 50.26548245743669
此次簡單總結了類中的三種方法,經過Pizza類的實例方便理解,若是你們有想和我溝通交流的,歡迎留言,或者點擊如下連接訪問個人網站:
謝謝閱讀