成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Python實例化class的執(zhí)行順序

remcarpediem / 2512人閱讀

摘要:實例變量是動態(tài)創(chuàng)建的。必須實例化之后才可以訪問,因為之前是不存在的。看看類繼承時怎么運行的的的的輸出如下來現(xiàn)身說法,解釋一波首先對進行實例化,從頭到尾掃一遍,然后進入的構造,遇到了父類的構造方法。然后執(zhí)行完畢并彈出棧,執(zhí)行完畢并彈出棧。

Python里對類的實例化時有怎樣的順序
一般來說一個類里面有類變量和方法,比如我們定義一個名為A的類

class A():
    bar = "my lover love me"
    
    def __init__(self, name):
        print("A的class" ,self.__class__, name)

我們在這個類里面定義了一個類變量bar和一個構造方法__init__,那么我們實例化A()時都發(fā)生了什么呢!看官不要急,聽我慢慢道來...

首先,python 調用內置的type類,沒有聽錯,就是我們平時用來測引用類型的那個type,然后type調用內置的元類mateClass,mateClass再調用__new__方法將類實例化,此時完成了第一步

然后,這個實例將會初始化自己的類變量,就是把自己從頭到尾掃視一遍,

之后,進入構造方法,并初始化自己的實例變量。

注意:python中類變量和實例變量是不一樣的,

類變量:不用實例化也可以訪問。
實例變量:是動態(tài)創(chuàng)建的。必須實例化之后才可以訪問,因為之前是不存在的。

比如下面這個例子:不實例化訪問類變量

class A():
    a = 2
print(A.a)

輸出:
>>>2

說了這么多,上代碼??纯搭惱^承時怎么運行的:

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 class lee
B class lee
C class

來現(xiàn)身說法,解釋一波

首先對class C()進行實例化,從頭到尾掃一遍,然后進入C()的構造,遇到了父類C()的構造方法B.__init__。

進入class B(),從頭到尾掃一遍,執(zhí)行了print("this is B class")語句然后進入B()的構造,遇到了父類B()的構造方法A.__init__。

進入class A(),從頭到尾掃一遍,然后進入A()的構造方法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í)行完畢并彈出棧。程序運行完畢。

由于是對class C()進行實例化,上面的self都是指class C()的實例而不是class A()的或者class B()的。因此self.__class__清一色的顯示而不是。

隨便補充一下使用type關鍵字動態(tài)創(chuàng)建類的知識點,敲黑板、、、我要用CET3.5的英語水平向大家翻譯一部分官方文檔對type的描述啦。

使用三個參數(shù),返回一個新類型對象。這實際上是類語句的動態(tài)形式。名稱字符串是類名,并成為__name__屬性;基元元組列出基類并成為>__bases__屬性;并且dict字典是包含類主體定義的命名空間,并被復制到標準字典以成為__dict__屬性。

怎么樣,是不是很拗口,是不是大寫的懵*。so,上代碼,以下兩種寫法輸出一樣的都是輸出:重寫name方法 1

class X():
    a = 1
    def __name__(self):
    return "重寫name方法"   
x =X()
print(x.__name__(), x.a)

X = type("重寫name方法", (object,), dict(a = 1))
x = X()
print(X.__name__, x.a)

type動態(tài)創(chuàng)建實例化時,第一個參數(shù)就相當于重寫了類的__name__方法。X類但__name__屬性卻不叫X,呵,好反人類的寫法
還好我們一般不是這么{{BANNED}},通常我們會將這兩個定義成相同的名字,如下:都叫X
X = type("X", (object,), dict(a = 1))
歡迎大家踴躍評論,提出建議哦~

先更新到這里。。。。 2018/10/09

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.hztianpu.com/yun/42608.html

相關文章

  • Python理解面向對象

    摘要:面向對象編程,簡稱,是一種程序設計思想。面向過程與面向對象面向過程的程序設計把函數(shù)作為程序的基本單元。以上是在計算機世界里認識面向對象和面向過程,接下來給大家舉個生活中的例子就拿你早上想吃雞蛋灌餅為例。 面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象作為程序的基本單元,一個對象包含了數(shù)據和操作數(shù)據的函數(shù)。 面向過程 ...

    hatlonely 評論0 收藏0
  • Python基礎之(八)類

    摘要:方法綁定方法多重繼承實例化實現(xiàn)了方法和實例的綁調用綁定方法非綁定方法在子類中,父類的方法就是非綁定方法,因為在子類中,沒有建立父類的實例,卻要是用父類的方法。 類 創(chuàng)建類 第一形式 # !/usr/bin/env python # coding=utf-8 class Person(object): #object表示繼承自object類,Python3中可省略次內容 ...

    Freeman 評論0 收藏0
  • Python_OOP

    摘要:魔法方法類構造方法魔法方法初始化對象創(chuàng)建對象的過程創(chuàng)建一個對象解釋器會自動的調用方法返回創(chuàng)建的對象的引用,給實例實例化執(zhí)行該方法,返回值。當引用計數(shù)為時,該對象生命就結束了。 define class class的三個組成部分: 類的名稱:類名 類的屬性: 一組數(shù)據 類的方法:允許對進行操作的方法(行為) 定義 class Student (object): pass...

    tyheist 評論0 收藏0
  • SICP Python 描述 2.5 面向對象編程

    摘要:類似消息傳遞中的分發(fā)字典,對象響應行為請求。消息傳遞和點表達式方法定義在類中,而實例屬性通常在構造器中賦值,二者都是面向對象編程的基本元素。使用帶有內建對象系統(tǒng)語言的優(yōu)點是,消息傳遞能夠和其它語言特性,例如賦值語句無縫對接。 2.5 面向對象編程 來源:2.5 Object-Oriented Programming 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 面向對象編程...

    starsfun 評論0 收藏0
  • Python中繼承優(yōu)缺點

    摘要:本文重點不要試圖在內置類型的子類中重寫方法,可以繼承的可拓展類尋求變通掌握多重繼承中的和了解處理多重繼承的一些建議。子類化的代碼如下輸出小結上述問題只發(fā)生在語言實現(xiàn)的內置類型子類化情況中,而且只影響直接繼承內置類型的自定義類。 導語:本文章記錄了本人在學習Python基礎之面向對象篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、不要試圖在內置...

    Sourcelink 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<