Python 面向對象編程OOP (三) 類方法,靜態方法

類的方法概覽

首先回顧一下Python OOP常見的三種方法:python

  • instance method 實例/接口方法
  • class method 類方法
  • static method 靜態方法

標準書寫方式以下: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類的實例方便理解,若是你們有想和我溝通交流的,歡迎留言,或者點擊如下連接訪問個人網站:

謝謝閱讀

相關文章
相關標籤/搜索