Python構(gòu)建類函數(shù) Python的構(gòu)造函數(shù)

核心解密Python函數(shù)在(類與函數(shù)之間)和(類與類之間)互相調(diào)用

首先來看一個(gè)函數(shù)間的調(diào)用

創(chuàng)新互聯(lián)專注于白山企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,電子商務(wù)商城網(wǎng)站建設(shè)。白山網(wǎng)站建設(shè)公司,為白山等地區(qū)提供建站服務(wù)。全流程定制設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

類方法:

執(zhí)行結(jié)果:

metaclass能有什么用處,先來個(gè)感性的認(rèn)識(shí):

1.1 在wiki上面,metaclass是這樣定義的:In object-oriented programming,

a metaclass is a class whose instances are classes.

Just as an ordinary class defines the behavior of certain objects,

a metaclass defines the behavior of certain classes and their instances.

也就是說metaclass的實(shí)例化結(jié)果是類,而class實(shí)例化的結(jié)果是instance。我是這么理解的:

metaclass是類似創(chuàng)建類的模板,所有的類都是通過他來create的(調(diào)用 new ),這使得你可以自由的控制

創(chuàng)建類的那個(gè)過程,實(shí)現(xiàn)你所需要的功能。

當(dāng)然你也可以用函數(shù)的方式(下文會(huì)講)

4.1 用類的形式

4.1.1 類繼承于type, 例如: class Meta(type):pass

4.1.2 將需要使用metaclass來構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為Meta(繼承于type的類)

4.2 用函數(shù)的形式

4.2.1 構(gòu)建一個(gè)函數(shù),例如叫metaclass_new, 需要3個(gè)參數(shù):name, bases, attrs,

name: 類的名字

bases: 基類,通常是tuple類型

attrs: dict類型,就是類的屬性或者函數(shù)

4.2.2 將需要使用metaclass來構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為函數(shù)metaclas_new

5.1 basic

metaclass的原理其實(shí)是這樣的:當(dāng)定義好類之后,創(chuàng)建類的時(shí)候其實(shí)是調(diào)用了type的 new 方法為這個(gè)類分配內(nèi)存空間,創(chuàng)建

好了之后再調(diào)用type的 init 方法初始化(做一些賦值等)。所以metaclass的所有magic其實(shí)就在于這個(gè) new 方法里面了。

說說這個(gè)方法: new (cls, name, bases, attrs)

cls: 將要?jiǎng)?chuàng)建的類,類似與self,但是self指向的是instance,而這里cls指向的是class

name: 類的名字,也就是我們通常用類名. name 獲取的。

bases: 基類

attrs: 屬性的dict。dict的內(nèi)容可以是變量(類屬性),也可以是函數(shù)(類方法)。

所以在創(chuàng)建類的過程,我們可以在這個(gè)函數(shù)里面修改name,bases,attrs的值來自由的達(dá)到我們的功能。這里常用的配合方法是

getattr和setattr(just an advice)

下面實(shí)現(xiàn)python中在一個(gè)類中調(diào)用另一個(gè)類的函數(shù)方法

或者下面來一個(gè)號(hào)理解的例子

執(zhí)行結(jié)果:

先來介紹內(nèi)部類與外部類是什么?

看源碼解析:

內(nèi)部類調(diào)用外部類的類屬性和類方法

參考文獻(xiàn)1

參考文獻(xiàn)2

參考文獻(xiàn)3

Python-類的創(chuàng)建和使用

創(chuàng)建一個(gè)寵物 Pet 類,根據(jù)該類創(chuàng)建的每個(gè)實(shí)例都將存儲(chǔ)名字和物種,賦予每個(gè)寵物吃飯(eat())和睡覺(sleep())的能力:

根據(jù)類創(chuàng)建實(shí)例

調(diào)用方法

給上面的例子進(jìn)行補(bǔ)充,設(shè)置一個(gè)寵物到家的初始時(shí)間默認(rèn)值為 0,對(duì)某個(gè)屬性設(shè)定默認(rèn)值可以不提供形參。

調(diào)用一下read_time()

增加一個(gè) update_time() 的方法,指定初始時(shí)間

調(diào)用

新增一個(gè) increment_time() 方法,表示較初始值而言增加的時(shí)間

調(diào)用

一個(gè)類繼承另一個(gè)類時(shí),它將自動(dòng)獲得另一個(gè)類的所有屬性和方法;原有的類稱為父類,而新類稱為子類。子類繼承了其父類的所有屬性和方法,同時(shí)還可以定義自己的屬性和方法。

創(chuàng)建一個(gè) Cat 類,繼承 Pet 的屬性,同時(shí)可以定義 Cat 特有的屬性。

調(diào)用

如果子類中的某些屬性與父類不一樣,可以在子類新建方法重新定義來改寫父類。

類的導(dǎo)入和函數(shù)的導(dǎo)入相同。

Python函數(shù)的定義(構(gòu)造)和調(diào)用

這里來給大家演示一下,函數(shù)的定義或構(gòu)造,并調(diào)用函數(shù)來實(shí)現(xiàn)封裝后的效果。

首先我們來看看想實(shí)現(xiàn)下面的這個(gè)效果,如果不使用函數(shù)應(yīng)該怎么實(shí)現(xiàn)。

以上兩種返回結(jié)果都是1-9這幾個(gè)數(shù)字。

以上兩種方法,第一種代碼重復(fù)率太高,代碼美觀效果太差,雖然能實(shí)現(xiàn)效果,但是因?yàn)閿?shù)量比較少,還能手工打出來這幾行代碼,如果是打印1-100000就很難實(shí)現(xiàn)了。這時(shí)候for循環(huán)還是可以實(shí)現(xiàn)的,但是for循環(huán)只能實(shí)現(xiàn)類似的數(shù)字和變量循環(huán),無法進(jìn)行復(fù)雜的功能開發(fā)。鑒于此,函數(shù)這個(gè)概念就被python引入了,下面先來看看函數(shù)是怎么實(shí)現(xiàn)上面的效果的,還是兩種方法。

這時(shí)候如果想實(shí)現(xiàn)上面的打印結(jié)果就直接使用函數(shù)名+小括號(hào)調(diào)用函數(shù)就可以了,這種類型的語法,不僅可以反復(fù)使用,而且封裝后的代碼更美觀。

python 構(gòu)造器

1.類的構(gòu)造函數(shù),用于初始化類成員等,只能用 init ,不能換其他名字

2. init 方法的意義: init 方法在類的一個(gè)對(duì)象被建立時(shí),馬上運(yùn)行。

def init (self, name):

xxxxxxxxxx

3.類的方法與普通的函數(shù)只有一個(gè)特別的區(qū)別——它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱,但是在調(diào)用這個(gè)方法的時(shí)候你不為這個(gè)參數(shù)賦值,Python會(huì)提供這個(gè)值。這個(gè)特別的變量指對(duì)象本身,按照慣例它的名稱是self。

4. init 不是構(gòu)造函數(shù),Python對(duì)象在調(diào)用 init 的時(shí)候已被構(gòu)造出來,稱為“初始化”比較合適。

5.如果子類的方法覆蓋了父類,想調(diào)用父類的方法怎么辦?

Python沒有super,很簡單,直接“父類名.方法”即可。

當(dāng)前名稱:Python構(gòu)建類函數(shù) Python的構(gòu)造函數(shù)
網(wǎng)站鏈接:http://muchs.cn/article36/hgehpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站營銷定制網(wǎng)站、網(wǎng)站維護(hù)自適應(yīng)網(wǎng)站、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)