溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python3類對象要不要在init中初始化

發(fā)布時間:2020-11-17 09:37:06 來源:億速云 閱讀:204 作者:小新 欄目:編程語言

了解python3類對象要不要在init中初始化?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

先看這段代碼:

class Cycle(object):
    def __init__(self,r):
        self.pi=3.1415926
        self.r=r
 
a=Cycle(10)
b=Cycle(7)

首先,經(jīng)??吹竭@樣一個情況,為什么,我們通常定義的方法,為什么第一個參數(shù)需要是 self ,其實很簡單,用來和具體實例綁定的。這一段代碼,將 Cycle 實例化了兩次,最后你輸出 a.r 和 b.r 彼此的值是不一樣的。那么實例變量的定義就很清晰了。

那么什么是類變量呢?

 上面用 Cycle 這個類來描述一個圓。里面存在著一個變量 pi ,不同的圓,其 pi 值固定,那么我們可以將其抽象出來,諸多圓實例共享一個變量 pi

class Cycle(object):
    pi=3.1415926
    def __init__(self,r):
        self.r=r
 
a=Cycle(10)
b=Cycle(7)

那么為什么實例可以訪問類變量呢?

 很簡單,在我們調(diào)用具體變量的時候,遵循如下的查找規(guī)則

 1. 優(yōu)先從實例中查找變量,如果沒查找到執(zhí)行 2

2. 從類中查找變量,如果沒查找到執(zhí)行 3

3. 按照繼承鏈繼續(xù)查找,直到找到或者到頂端沒找到拋出異常為止

首先代碼是這樣的

class test:
    a=[1]*30
 
x=test()
x.a[1]=100
y=test()
print(y.a[1])

我們來詳細(xì)分析下首先聲明了一個類變量a,值為list里面包含了30個元素然后實例化了一個實例 x接著執(zhí)行 x.a[1]=100這一步發(fā)生了很多隱式的操作,我們慢慢講首先,根據(jù)我們前面說的變量查找規(guī)則,在實例中沒有查找到 a 這個變量后,然后向上到類里查找,誒!查找到了 a 這個 list ,緊接著,調(diào)用 list 中的方法 __setitem__ 來設(shè)置 list 中的第 2 個元素的值為 100 。誒?發(fā)現(xiàn)沒有,我們這里,還是對類變量中的值進(jìn)行修改了。好了重新復(fù)習(xí)下我們類變量的概念和類進(jìn)行綁定的變量,該類的實例之間可以共享變量恩,在前面對類變量值進(jìn)行修改了。然后類變量是被實例共享的,所以第二次實例化操作得到的實例 y 后,y.a[1] 得到的是不是我們修改后的值?

好了,再看下一段代碼

class test:
    a=None
    def __init__(self):
        self.a=[1]*30
x=test()
x.a[1]=100
y=test()
print(y.a[1])

__init__ 方法中,是不是聲明了一個實例變量a,復(fù)習(xí)下我們實例變量的概念和實例綁定的變量,即實例變量,實例之間各自數(shù)據(jù)隔離,互不通用。和實例綁定的變量,實例之間彼此數(shù)據(jù)隔離,互不通用。那么兩個實例 x,y 不管怎么修改,是不是只修改了和實例綁定的變量值,并不會影響其余實例的表現(xiàn)。

感謝各位的閱讀!看完上述內(nèi)容,你們對python3類對象要不要在init中初始化大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI