摘要:類的方法概覽首先回顧一下常見的三種方法實(shí)例接口方法類方法靜態(tài)方法標(biāo)準(zhǔn)書寫方式如下我們最常用的其實(shí)就是普通的接口方法,其他兩個(gè)需要用類似裝飾器的寫法來標(biāo)注。類方法接受一個(gè)作為參數(shù),它是指向本身的,并不是所創(chuàng)建的實(shí)例。
類的方法概覽
首先回顧一下Python OOP常見的三種方法:
instance method 實(shí)例/接口方法
class method 類方法
static method 靜態(tài)方法
標(biāo)準(zhǔn)書寫方式如下:
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"
我們最常用的其實(shí)就是普通的接口方法,其他兩個(gè)需要用類似裝飾器的寫法來標(biāo)注。
類方法接受一個(gè)cls作為參數(shù),它是指向MyClass本身的,并不是MyClass所創(chuàng)建的實(shí)例。
靜態(tài)方法不接受self或者cls作為參數(shù),所以不會(huì)修改類本身或者實(shí)例
類方法示例看一下如何使用類方法,新建一個(gè)Pizza類,主要參數(shù)為原料ingredients
class Pizza: def __init__(self, ingredients): self.ingredients = ingredients def __repr__(self): return f"Pizza({self.ingredients !r})"
新建一個(gè)實(shí)例測(cè)試一下:
Pizza(["cheese", "tomatoes"]) Out: Pizza(["cheese", "tomatoes"])
測(cè)試成功。
現(xiàn)在問題來了,既然是Pizza類,會(huì)有不同口味的Pizza,他們的配方都是固定的,那么如何便捷的生成不同口味的Pizza呢,答案就是classmethod
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"])
類方法可以根據(jù)需求事先預(yù)定義生成的實(shí)例,減少了代碼量,這里我們根據(jù)margherita和prosciutto兩種口味pizza的原料提前準(zhǔn)備好了,cls就是代表類本身,這樣如果我們?cè)偕梢恍?shí)例時(shí),會(huì)方便很多:
#生成一個(gè)margherita口味的pizza m = Pizza.margherita() m Out:Pizza(["mozzarella", "tomatoes"])
#生成一個(gè)prosciutto口味的pizza p = Pizza.prosciutto() p Out:Pizza(["mozzarella", "tomatoes", "ham"])靜態(tài)方法示例
那么什么時(shí)候用靜態(tài)方法呢? 比如還用這個(gè)例子,我想計(jì)算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
這種情況下使用一個(gè)靜態(tài)方法是一個(gè)好的選擇,通過area這個(gè)普通的接口方法,可以調(diào)用circle_area來計(jì)算面積,封裝性更好:
p = Pizza(4, ["mozzarella", "tomatoes"]) p.area() Out: 50.26548245743669總結(jié)
這次簡(jiǎn)單總結(jié)了類中的三種方法,通過Pizza類的實(shí)例方便理解,如果大家有想和我溝通交流的,歡迎留言,或者點(diǎn)擊以下鏈接訪問我的網(wǎng)站:
我的Github 靜態(tài)博客
謝謝閱讀
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/45182.html
摘要:時(shí)代,如果需要手動(dòng)繼承,如多態(tài)多態(tài)是指,不同的子類對(duì)象調(diào)用相同的父類方法,會(huì)產(chǎn)生多態(tài)多樣結(jié)果的編程特性。 參考:黑馬程序員教程 - Python基礎(chǔ) 面向?qū)ο?OOP三大特性,且三個(gè)特性是有順序的: 封裝 繼承 多態(tài) 封裝 指的就是把現(xiàn)實(shí)世界的事務(wù),封裝、抽象成編程里的對(duì)象,包括各種屬性和方法。這個(gè)一般都很簡(jiǎn)單,不需要多講。 唯一要注意的就是:推薦從小往大開始封裝、開發(fā)類。比如手槍...
摘要:新的稱為子類,而被繼承的稱為基類父類或超類。繼承最大的好處是子類獲得了父類的全部功能。在繼承關(guān)系中,如果一個(gè)實(shí)例的數(shù)據(jù)類型是某個(gè)子類,那它的數(shù)據(jù)類型也可以被看做是父類。 在上一篇中我們介紹了模塊和數(shù)據(jù)結(jié)構(gòu),這一篇將介紹面向?qū)ο缶幊獭? 面向?qū)ο缶幊?面向?qū)ο缶幊獭狾bject Oriented Programming,簡(jiǎn)稱 OOP,是一種程序設(shè)計(jì)思想。OOP 把對(duì)象作為程序的基本單元...
摘要:反對(duì)者在某些領(lǐng)域?qū)Υ擞枰苑裾J(rèn)。下面再引用一段來自維基百科中關(guān)于的歷史。類的更嚴(yán)格的定義是由某種特定的元數(shù)據(jù)所組成的內(nèi)聚的包。類還可以有運(yùn)行時(shí)表示形式元對(duì)象,它為操作與類相關(guān)的元數(shù)據(jù)提供了運(yùn)行時(shí)支持。 在開始部分,請(qǐng)看官非常非常耐心地閱讀下面幾個(gè)枯燥的術(shù)語解釋,本來這不符合本教程的風(fēng)格,但是,請(qǐng)看官諒解,因?yàn)榱形粚硪欢ㄒ喿x枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。 1、問題...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 1302·2021-11-25 09:43
閱讀 1396·2021-09-26 09:55
閱讀 2481·2021-09-10 11:20
閱讀 3428·2019-08-30 15:55
閱讀 1527·2019-08-29 13:58
閱讀 1237·2019-08-29 12:36
閱讀 2428·2019-08-29 11:18
閱讀 3490·2019-08-26 11:47