1. 程式人生 > >python的類變數和成員變數

python的類變數和成員變數

先看看下面程式碼:

class TestClass(object):
    val1 = 100
    
    def __init__(self):
        self.val2 = 200
    
    def fcn(self,val = 400):
        val3 = 300
        self.val4 = val
        self.val5 = 500 
 if __name__ == '__main__':
    inst = TestClass()
     
    print TestClass.val1
    print inst.val1
    print inst.val2
    print inst.val3
    print inst.val4    
    print inst.val5
這裡,val1是類變數,可以由類名直接呼叫,也可以有物件來呼叫;

val2是成員變數,可以由類的物件來呼叫,這裡可以看出成員變數一定是以self.的形式給出的,因為self的含義就是代表例項物件;

val3不是成員變數,它只是函式fcn內部的區域性變數;

val4和val5也都不是成員變數,雖是以self.給出,但並沒有在建構函式中初始化。

再看看下面的程式碼(#號後面的是執行結果):

    inst1 = TestClass()
    inst2 = TestClass()
     
    print TestClass.val1 # 100
    print inst1.val1     # 100
    
    inst1.val1 = 1000    
    print inst1.val1     # 1000
    print TestClass.val1 # 100
    
    TestClass.val1 =2000 
    print inst1.val1     # 1000
    print TestClass.val1 # 2000
    
    print inst2.val1     # 2000     
    
    inst3 = TestClass()  
    print inst3.val1     # 2000

可以發現:python的類變數和C++的靜態變數不同,區別在於python的物件使用類變數時,會進行一次記憶體拷貝。python中,類本身擁有自己的類變數(儲存在記憶體),當物件第一次呼叫類變數時,會將當前類變數拷貝一份給這個物件,當前類變數的值是多少,這個物件拷貝得到的類變數的值就是多少;而且,通過物件來修改類變數,並不會影響其他物件的類變數的值,因為大家都有各自的副本,更不會影響類本身所擁有的那個類變數的值;只有類自己才能改變類本身擁有的類變數的值。

有一點值得注意:物件的類變數是什麼時候初始化的(從類的類變數拷貝過來)?通過上例中inst2.val1的列印結果是2000可以發現,物件的類變數並不是構造物件的時候初始化的,而是在第一次通過物件呼叫該類變數的時候

從類變數當前的值拷貝過來的。此後便互不影響。

相關推薦

python變數成員變數

先看看下面程式碼: class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 def fcn(self,val = 400):

Python變數成員變數以及區域性變數

Python的類變數可以通過類和例項名字進行訪問而成員變數只能通過例項名來訪問,區域性變數只能在方法體內被使用。 http://blog.csdn.net/lc_910927/article/details/38757363 類變數和成員變數雖然名字相同但是

JAVA基礎(44)---區域性變數成員變數的區別及封裝

成員變數和區域性變數的區別                       

JAVA基礎(45)---區域性變數成員變數的區別及封裝

成員變數和區域性變數的區別                                1、在類中的位置不同                                            

8_物件建立、static 關鍵字、靜態變數成員變數的區別、文件

一、物件建立   Student s = new Student(); 步驟: (1)載入 Student.class 檔案進記憶體; (2)在棧記憶體中為 s 開闢空間; (3)在堆記憶體為學生物件開闢空間; (4)對學生物件的成員變數進行預設初始化; (5)對學生物件的成員變數進行顯示初始化

Java學習筆記——區域性變數成員變數

區別 1.定義的位置不一樣 區域性變數在方法的內部 成員變數在方法的外部,直接寫在類當中 2.作用範圍不一樣 區域性變數只有在方法中才能用,出了方法就不能用了 成員變數整個類都能用 3.預設值不一樣 區域性變數沒有預設值,如果想要使用,必須手動賦值 成員變數有預設值 4.記憶體的位置不一樣

java中靜態變數成員變數的區別

所屬不同:靜態變數屬於類,所以也稱為為類變數;成員變數屬於物件,所以也稱為例項變數(物件變數)在記憶體中位置不同:靜態變數儲存於方法區裡的靜態區;成員變數儲存於堆記憶體區在記憶體中出現的時間不同:靜態變

this的含義區域性變數成員變數的訪問

this指的是類本身。類建立了一個函式,那麼此時函式就有了自己的東西,再想呼叫類的東西就要加this。再比如說,類中有變數,而類的方法中如果定義了同樣的變數,此時還想用到類的變數的話,那麼就加this。 區域性變數的訪問和成員變數的訪問是不同的,如果想訪問成員變數,此時需要

多執行緒-區域性變數成員變數

Java多執行緒對成員變數和區域性變數的影響 最近複習了一下Java多執行緒的一些基礎的礎知識,這裡演示一個java多執行緒對成員變數和區域性變數的Demo 對區域性變數的操作: /** * Java區域性變數和成員變數程式碼演示 */ publi

執行緒中全域性變數成員變數

線上程中,run方法中呼叫的變數不同,那麼程式執行的結果也不同,變數屬於成員變數還是屬於區域性變數,要處理物件的變數還是方法中的變數會導致結果的差異性。 1)執行緒處理了全域性變數 package

python全棧開發【第五篇】Python變數不可變數

字符 數字 布爾類型 post 9.png inf img 改變 不可變類 1.可變數據類型:在id不變的情況下,value可改變(列表和字典是可變類型,但是字典中的key值必須是不可變類型) 2.不可變數據類型:value改變,id也跟著改變。(數字,字符串,布爾類型

python下,物件例項物件區別,變數例項變數區別

Y14 一、類物件和例項物件 簡短理論: 類物件是將具有相似屬性和方法的物件總結抽象為類物件,可以定義相似的一些屬性和方法,不同的例項物件去引用類物件的屬性和方法,能減少程式碼的重複率。 例項物件又稱例項化物件,不是抽象而是一類物件中具體的一例物件。 比

java基礎1-成員變數區域性變數

成員變數:寫在類體的裡面,方法體的外面,宣告時可以不進行初始化值,可以被本類或其他類的方法進行呼叫。區域性變數:寫在方法體的裡面,宣告時必須進行初始化,只能在宣告區域性變數的方法內進行呼叫。 public class Student { String name; int age=20; b

Python 中的變數例項變數(關鍵詞:Python/變數/例項變數

類變數: class 語句的頂層進行賦值的變數,會被附加在類中,被所有例項所共享; 例項變數:附加在例項上的變數,不被共享,可通過這 2 種方式建立或修改: aInstance.name = sth 的形式; 類的例項方法中,self.name = sth 的形式。

C++---的靜態成員變數靜態成員函式

class Person { public : Person() { } static int m_Age ; //加入static 就是靜態成員變數,會共享資料; //靜態成員變數,在類內宣告,類外進行初始化; } int Person.m_Age = 0; //類外初始化

java基礎———與物件,成員變數區域性變數,封裝及關鍵字staticthis

類與物件,成員變數和區域性變數,封裝及關鍵字static和this 面向物件的思想 類與物件及其應用 物件的記憶體圖 成員變數和區域性變數的區別 匿名物件 封裝(private) this關鍵字 構造方法 物件的建立步驟

C++----成員變數成員函式在的儲存方式

類的成員變數和成員函式在類的儲存方式為分開儲存。 即只有非靜態變數儲存在類中,其餘的所有成員均不在類中。 實驗如下: exp1: class Person1 { }; void test01() { cout << "size of (空類Person)

Python語言特性-變數例項變數

類變數: 是可在類的所有例項間共享的值,類變數用於跟蹤存在著多少個Test的例項 例項變數: 例項化之後,每個例項都會有單獨的變數 例1 class Test(object): num_of_instance = 0 def __init__(self, n

Java基礎(四)Java成員變數區域性變數

在Java中,成員變數和區域性變數存在較大的差異性。首先,我們來看一下變數的分類圖: 成員變數 成員變數被分為:類屬性和例項屬性。 例項屬性:定義一個屬性時,不使用static修飾的就是例項屬性, 類屬性:定義一個屬性時,使用static修飾的是類屬性。 類屬性從這

中static成員變數定義宣告

類中static成員變數的定義和宣告:在VS2010中,只能在類外定義同時賦值,在類中宣告。不能再類中宣告時賦值!! #include<iostream> using namespace std; class A { public: static int a