Python可以自定義新的類(lèi),然后用這些類(lèi)創(chuàng)建新對(duì)象。
東鄉(xiāng)族ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
class?Fruit:
def?__init__(self,?name):
self.name?=?name
def?prntName(self):
print?self.name
這是一個(gè)簡(jiǎn)單的Python類(lèi)的實(shí)現(xiàn)。
fruit?=?Fruit('apple')
fruit.prntName()
這樣子,我們就創(chuàng)建了一個(gè)自定義的新的對(duì)象了。
定義的類(lèi)只有進(jìn)行實(shí)例化,也就是使用該類(lèi)創(chuàng)建對(duì)象之后,才能得到利用??偟膩?lái)說(shuō),實(shí)例化后的類(lèi)對(duì)象可以執(zhí)行以下操作:
訪問(wèn)或修改類(lèi)對(duì)象具有的實(shí)例變量,甚至可以添加新的實(shí)例變量或者刪除已有的實(shí)例變量;
調(diào)用類(lèi)對(duì)象的方法,包括調(diào)用現(xiàn)有的方法,以及給類(lèi)對(duì)象動(dòng)態(tài)添加方法。
眾所周知,Python是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,在Python無(wú)論是數(shù)值、字符串、函數(shù)亦或是類(lèi)型、類(lèi),都是對(duì)象。
對(duì)象是在 堆 上分配的結(jié)構(gòu),我們定義的所有變量、函數(shù)等,都存儲(chǔ)于堆內(nèi)存,而變量名、函數(shù)名則是一個(gè)存儲(chǔ)于 棧 中、指向堆中具體結(jié)構(gòu)的引用。
要想深入學(xué)習(xí)Python,首先需要知道Python對(duì)象的定義。
我們通常說(shuō)的Python都是指CPython,底層由C語(yǔ)言實(shí)現(xiàn),源碼地址: cpython [GitHub]
Python對(duì)象的定義位于 Include/object.h ,是一個(gè)名為 PyObject 的結(jié)構(gòu)體:
Python中的所有對(duì)象都繼承自PyObejct,PyObject包含一個(gè)用于垃圾回收的雙向鏈表,一個(gè)引用計(jì)數(shù)變量 ob_refcnt 和 一個(gè)類(lèi)型對(duì)象指針 ob_type
從PyObejct的注釋中,我們可以看到這樣一句:每個(gè)指向 可變大小Python對(duì)象 的指針也可以轉(zhuǎn)換為 PyVarObject* (可變大小的Python對(duì)象會(huì)在下文中解釋?zhuān)?PyVarObejct 就是在PyObject的基礎(chǔ)上多了一個(gè) ob_size 字段,用于存儲(chǔ)元素個(gè)數(shù):
在PyObject結(jié)構(gòu)中,還有一個(gè)類(lèi)型對(duì)象指針 ob_type ,用于表示Python對(duì)象是什么類(lèi)型,定義Python對(duì)象類(lèi)型的是一個(gè) PyTypeObject 接口體
實(shí)際定義是位于 Include/cpython/object.h 的 _typeobject :
在這個(gè)類(lèi)型對(duì)象中,不僅包含了對(duì)象的類(lèi)型,還包含了如分配內(nèi)存大小、對(duì)象標(biāo)準(zhǔn)操作等信息,主要分為:
以Python中的 int類(lèi)型 為例,int類(lèi)型對(duì)象的定義如下:
從PyObject的定義中我們知道,每個(gè)對(duì)象的 ob_type 都要指向一個(gè)具體的類(lèi)型對(duì)象,比如一個(gè)數(shù)值型對(duì)象 100 ,它的ob_type會(huì)指向 int類(lèi)型對(duì)象PyLong_Type 。
PyTypeObject結(jié)構(gòu)體第一行是一個(gè)PyObject_VAR_HEAD宏,查看宏定義可知PyTypeObject是一個(gè)變長(zhǎng)對(duì)象
也就是說(shuō),歸根結(jié)底 類(lèi)型對(duì)象也是一個(gè)對(duì)象 ,也有ob_type屬性,那 PyLong_Type 的 ob_type 是什么呢?
回到PyLong_Type的定義,第一行 PyVarObject_HEAD_INIT(PyType_Type, 0) ,查看對(duì)應(yīng)的宏定義
由以上關(guān)系可以知道, PyVarObject_HEAD_INIT(PyType_Type, 0) = { { _PyObject_EXTRA_INIT 1, PyType_Type } 0} ,將其代入 PyObject_VAR_HEAD ,得到一個(gè)變長(zhǎng)對(duì)象:
這樣看就很明確了,PyLong_Type的類(lèi)型就是PyType_Typ,同理可知, Python類(lèi)型對(duì)象的類(lèi)型就是PyType_Type ,而 PyType_Type對(duì)象的類(lèi)型是它本身
從上述內(nèi)容中,我們知道了對(duì)象和對(duì)象類(lèi)型的定義,那么根據(jù)定義,對(duì)象可以有以下兩種分類(lèi)
Python對(duì)象定義有 PyObject 和 PyVarObject ,因此,根據(jù)對(duì)象大小是否可變的區(qū)別,Python對(duì)象可以劃分為 可變對(duì)象(變長(zhǎng)對(duì)象) 和 不可變對(duì)象(定長(zhǎng)對(duì)象)
原本的對(duì)象a大小并沒(méi)有改變,只是s引用的對(duì)象改變了。這里的對(duì)象a、對(duì)象b就是定長(zhǎng)對(duì)象
可以看到,變量l仍然指向?qū)ο骯,只是對(duì)象a的內(nèi)容發(fā)生了改變,數(shù)據(jù)量變大了。這里的對(duì)象a就是變長(zhǎng)對(duì)象
由于存在以上特性,所以使用這兩種對(duì)象還會(huì)帶來(lái)一種區(qū)別:
聲明 s2 = s ,修改s的值: s = 'new string' ,s2的值不會(huì)一起改變,因?yàn)橹皇莝指向了一個(gè)新的對(duì)象,s2指向的舊對(duì)象的值并沒(méi)有發(fā)生改變
聲明 l2 = l ,修改l的值: l.append(6) ,此時(shí)l2的值會(huì)一起改變,因?yàn)閘和l2指向的是同一個(gè)對(duì)象,而該對(duì)象的內(nèi)容被l修改了
此外,對(duì)于 字符串 對(duì)象,Python還有一套內(nèi)存復(fù)用機(jī)制,如果兩個(gè)字符串變量值相同,那它們將共用同一個(gè)對(duì)象:
對(duì)于 數(shù)值型 對(duì)象,Python會(huì)默認(rèn)創(chuàng)建0~2 8 以內(nèi)的整數(shù)對(duì)象,也就是 0 ~ 256 之間的數(shù)值對(duì)象是共用的:
按照Python數(shù)據(jù)類(lèi)型,對(duì)象可分為以下幾類(lèi):
Python創(chuàng)建對(duì)象有兩種方式,泛型API和和類(lèi)型相關(guān)的API
這類(lèi)API通常以 PyObject_xxx 的形式命名,可以應(yīng)用在任意Python對(duì)象上,如:
使用 PyObjecg_New 創(chuàng)建一個(gè)數(shù)值型對(duì)象:
這類(lèi)API通常只能作用于一種類(lèi)型的對(duì)象上,如:
使用 PyLong_FromLong 創(chuàng)建一個(gè)數(shù)值型對(duì)象:
在我們使用Python聲明變量的時(shí)候,并不需要為變量指派類(lèi)型,在給變量賦值的時(shí)候,可以賦值任意類(lèi)型數(shù)據(jù),如:
從Python對(duì)象的定義我們已經(jīng)可以知曉造成這個(gè)特點(diǎn)的原因了,Python創(chuàng)建對(duì)象時(shí),會(huì)分配內(nèi)存進(jìn)行初始化,然后Python內(nèi)部通過(guò) PyObject* 變量來(lái)維護(hù)這個(gè)對(duì)象,所以在Python內(nèi)部各函數(shù)直接傳遞的都是一種泛型指針 PyObject* ,這個(gè)指針?biāo)赶虻膶?duì)象類(lèi)型是不固定的,只能通過(guò)所指對(duì)象的 ob_type 屬性動(dòng)態(tài)進(jìn)行判斷,而Python正是通過(guò) ob_type 實(shí)現(xiàn)了多態(tài)機(jī)制
Python在管理維護(hù)對(duì)象時(shí),通過(guò)引用計(jì)數(shù)來(lái)判斷內(nèi)存中的對(duì)象是否需要被銷(xiāo)毀,Python中所有事物都是對(duì)象,所有對(duì)象都有引用計(jì)數(shù) ob_refcnt 。
當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)減少到0之后,Python將會(huì)釋放該對(duì)象所占用的內(nèi)存和系統(tǒng)資源。
但這并不意味著最終一定會(huì)釋放內(nèi)存空間,因?yàn)轭l繁申請(qǐng)釋放內(nèi)存會(huì)大大降低Python的執(zhí)行效率,因此Python中采用了內(nèi)存對(duì)象池的技術(shù),是的對(duì)象釋放的空間會(huì)還給內(nèi)存池,而不是直接釋放,后續(xù)需要申請(qǐng)空間時(shí),優(yōu)先從內(nèi)存對(duì)象池中獲取。
題主你好,
python中創(chuàng)建新實(shí)例的時(shí)候, 如果相應(yīng)的類(lèi)中定義了__init__()方法的話, 會(huì)自動(dòng)調(diào)用這個(gè)方法. 你可能認(rèn)為名稱(chēng)"init"和"__init__"差不多, 但計(jì)算機(jī)其實(shí)是個(gè)很笨的東西, 它會(huì)完全按照設(shè)計(jì)去執(zhí)行. 也就是說(shuō),在設(shè)計(jì)的時(shí)候就已經(jīng)定死了, 默認(rèn)情況下, 創(chuàng)建新實(shí)例的時(shí)候, 會(huì)自動(dòng)調(diào)用類(lèi)中定義的__init__()方法, 只要你的方法名和__init__有一點(diǎn)不一樣也不行.
下圖是我在官網(wǎng)上找的關(guān)于__init__()調(diào)用的簡(jiǎn)單說(shuō)明:
高亮部分說(shuō)的大概意思就是上面講的,如果相應(yīng)類(lèi)中定義了__init__()方法,則在創(chuàng)建該類(lèi)實(shí)例的時(shí)候會(huì)自動(dòng)調(diào)用里面定義的__init__()方法.
-----
希望可以幫到題主, 歡迎追問(wèn).
文章題目:python函數(shù)創(chuàng)建對(duì)象,python創(chuàng)建類(lèi)的對(duì)象
網(wǎng)頁(yè)網(wǎng)址:http://aaarwkj.com/article28/dsigdcp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、面包屑導(dǎo)航、網(wǎng)站營(yíng)銷(xiāo)、域名注冊(cè)、定制網(wǎng)站、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)