摘要:實(shí)例變量是動(dòng)態(tài)創(chuàng)建的。必須實(shí)例化之后才可以訪問(wèn),因?yàn)橹笆遣淮嬖诘摹?纯搭惱^承時(shí)怎么運(yùn)行的的的的輸出如下來(lái)現(xiàn)身說(shuō)法,解釋一波首先對(duì)進(jìn)行實(shí)例化,從頭到尾掃一遍,然后進(jìn)入的構(gòu)造,遇到了父類的構(gòu)造方法。然后執(zhí)行完畢并彈出棧,執(zhí)行完畢并彈出棧。
Python里對(duì)類的實(shí)例化時(shí)有怎樣的順序
一般來(lái)說(shuō)一個(gè)類里面有類變量和方法,比如我們定義一個(gè)名為A的類
class A(): bar = "my lover love me" def __init__(self, name): print("A的class" ,self.__class__, name)
我們?cè)谶@個(gè)類里面定義了一個(gè)類變量bar和一個(gè)構(gòu)造方法__init__,那么我們實(shí)例化A()時(shí)都發(fā)生了什么呢!看官不要急,聽(tīng)我慢慢道來(lái)...
首先,python 調(diào)用內(nèi)置的type類,沒(méi)有聽(tīng)錯(cuò),就是我們平時(shí)用來(lái)測(cè)引用類型的那個(gè)type,然后type調(diào)用內(nèi)置的元類mateClass,mateClass再調(diào)用__new__方法將類實(shí)例化,此時(shí)完成了第一步
然后,這個(gè)實(shí)例將會(huì)初始化自己的類變量,就是把自己從頭到尾掃視一遍,
之后,進(jìn)入構(gòu)造方法,并初始化自己的實(shí)例變量。
注意:python中類變量和實(shí)例變量是不一樣的,類變量:不用實(shí)例化也可以訪問(wèn)。
實(shí)例變量:是動(dòng)態(tài)創(chuàng)建的。必須實(shí)例化之后才可以訪問(wèn),因?yàn)橹笆遣淮嬖诘摹?/p>
比如下面這個(gè)例子:不實(shí)例化訪問(wèn)類變量
class A(): a = 2 print(A.a) 輸出: >>>2
說(shuō)了這么多,上代碼。看看類繼承時(shí)怎么運(yùn)行的:
class A(): def __init__(self, name): print("A的class" ,self.__class__, name) class B(A): def __init__(self, name): self._name = name A.__init__(self, name) print("B的class", self.__class__, name) print("this is B class") class C(B): def __init__(self, name): B.__init__(self, name) print("C的class") if __name__ == "__main__": c = C("lee")
輸出如下:
this is B class
A classlee
B classlee
C class
來(lái)現(xiàn)身說(shuō)法,解釋一波
首先對(duì)class C()進(jìn)行實(shí)例化,從頭到尾掃一遍,然后進(jìn)入C()的構(gòu)造,遇到了父類C()的構(gòu)造方法B.__init__。
進(jìn)入class B(),從頭到尾掃一遍,執(zhí)行了print("this is B class")語(yǔ)句然后進(jìn)入B()的構(gòu)造,遇到了父類B()的構(gòu)造方法A.__init__。
進(jìn)入class A(),從頭到尾掃一遍,然后進(jìn)入A()的構(gòu)造方法A.__init__。然后A.__init__執(zhí)行完畢并彈出棧,class A()執(zhí)行完畢并彈出棧。
回到class B(),從上次未執(zhí)行完的地方print("B的class", self.__class__, name)繼續(xù)執(zhí)行。然后B.__init__執(zhí)行完畢并彈出棧,class B()執(zhí)行完畢并彈出棧。
回到class C(),從上次未執(zhí)行完的地方print("C的class")繼續(xù)執(zhí)行。然后C.__init__執(zhí)行完畢并彈出棧,class C()執(zhí)行完畢并彈出棧。程序運(yùn)行完畢。
由于是對(duì)class C()進(jìn)行實(shí)例化,上面的self都是指class C()的實(shí)例而不是class A()的或者class B()的。因此self.__class__清一色的顯示
隨便補(bǔ)充一下使用type關(guān)鍵字動(dòng)態(tài)創(chuàng)建類的知識(shí)點(diǎn),敲黑板、、、我要用CET3.5的英語(yǔ)水平向大家翻譯一部分官方文檔對(duì)type的描述啦。
使用三個(gè)參數(shù),返回一個(gè)新類型對(duì)象。這實(shí)際上是類語(yǔ)句的動(dòng)態(tài)形式。名稱字符串是類名,并成為__name__屬性;基元元組列出基類并成為>__bases__屬性;并且dict字典是包含類主體定義的命名空間,并被復(fù)制到標(biāo)準(zhǔn)字典以成為__dict__屬性。
怎么樣,是不是很拗口,是不是大寫(xiě)的懵*。so,上代碼,以下兩種寫(xiě)法輸出一樣的都是輸出:重寫(xiě)name方法 1
class X(): a = 1 def __name__(self): return "重寫(xiě)name方法" x =X() print(x.__name__(), x.a)
X = type("重寫(xiě)name方法", (object,), dict(a = 1)) x = X() print(X.__name__, x.a)
type動(dòng)態(tài)創(chuàng)建實(shí)例化時(shí),第一個(gè)參數(shù)就相當(dāng)于重寫(xiě)了類的__name__方法。X類但__name__屬性卻不叫X,呵,好反人類的寫(xiě)法
還好我們一般不是這么{{BANNED}},通常我們會(huì)將這兩個(gè)定義成相同的名字,如下:都叫X
X = type("X", (object,), dict(a = 1))
歡迎大家踴躍評(píng)論,提出建議哦~
先更新到這里。。。。 2018/10/09
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42608.html
摘要:面向?qū)ο缶幊蹋?jiǎn)稱,是一種程序設(shè)計(jì)思想。面向過(guò)程與面向?qū)ο竺嫦蜻^(guò)程的程序設(shè)計(jì)把函數(shù)作為程序的基本單元。以上是在計(jì)算機(jī)世界里認(rèn)識(shí)面向?qū)ο蠛兔嫦蜻^(guò)程,接下來(lái)給大家舉個(gè)生活中的例子就拿你早上想吃雞蛋灌餅為例。 面向?qū)ο缶幊獭狾bject Oriented Programming,簡(jiǎn)稱OOP,是一種程序設(shè)計(jì)思想。OOP把對(duì)象作為程序的基本單元,一個(gè)對(duì)象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。 面向過(guò)程 ...
摘要:方法綁定方法多重繼承實(shí)例化實(shí)現(xiàn)了方法和實(shí)例的綁調(diào)用綁定方法非綁定方法在子類中,父類的方法就是非綁定方法,因?yàn)樵谧宇愔校瑳](méi)有建立父類的實(shí)例,卻要是用父類的方法。 類 創(chuàng)建類 第一形式 # !/usr/bin/env python # coding=utf-8 class Person(object): #object表示繼承自object類,Python3中可省略次內(nèi)容 ...
摘要:魔法方法類構(gòu)造方法魔法方法初始化對(duì)象創(chuàng)建對(duì)象的過(guò)程創(chuàng)建一個(gè)對(duì)象解釋器會(huì)自動(dòng)的調(diào)用方法返回創(chuàng)建的對(duì)象的引用,給實(shí)例實(shí)例化執(zhí)行該方法,返回值。當(dāng)引用計(jì)數(shù)為時(shí),該對(duì)象生命就結(jié)束了。 define class class的三個(gè)組成部分: 類的名稱:類名 類的屬性: 一組數(shù)據(jù) 類的方法:允許對(duì)進(jìn)行操作的方法(行為) 定義 class Student (object): pass...
摘要:類似消息傳遞中的分發(fā)字典,對(duì)象響應(yīng)行為請(qǐng)求。消息傳遞和點(diǎn)表達(dá)式方法定義在類中,而實(shí)例屬性通常在構(gòu)造器中賦值,二者都是面向?qū)ο缶幊痰幕驹亍J褂脦в袃?nèi)建對(duì)象系統(tǒng)語(yǔ)言的優(yōu)點(diǎn)是,消息傳遞能夠和其它語(yǔ)言特性,例如賦值語(yǔ)句無(wú)縫對(duì)接。 2.5 面向?qū)ο缶幊? 來(lái)源:2.5 Object-Oriented Programming 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 面向?qū)ο缶幊?..
摘要:本文重點(diǎn)不要試圖在內(nèi)置類型的子類中重寫(xiě)方法,可以繼承的可拓展類尋求變通掌握多重繼承中的和了解處理多重繼承的一些建議。子類化的代碼如下輸出小結(jié)上述問(wèn)題只發(fā)生在語(yǔ)言實(shí)現(xiàn)的內(nèi)置類型子類化情況中,而且只影響直接繼承內(nèi)置類型的自定義類。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、不要試圖在內(nèi)置...
閱讀 511·2021-10-09 09:44
閱讀 2073·2021-09-02 15:41
閱讀 3550·2019-08-30 15:53
閱讀 1829·2019-08-30 15:44
閱讀 1283·2019-08-30 13:10
閱讀 1188·2019-08-30 11:25
閱讀 1458·2019-08-30 10:51
閱讀 3365·2019-08-30 10:49