先看看下面**:
[python]
view plain
copy
class
testclass(object):
val1 = 100
def__init__(
self
):
self
.val2 =
200def
fcn(
self
,val =
400):
val3 = 300
self
.val4 = val
self
.val5 =
500if
__name__ ==
'__main__'
: inst = testclass()
testclass.val1
inst.val1
inst.val2
inst.val3
inst.val4
inst.val5
這裡,val1是類變數,可以由類名直接呼叫,也可以有物件來呼叫;
val2是成員變數,可以由類的物件來呼叫,這裡可以看出成員變數一定是以self.的形式給出的,因為self的含義就是代表例項物件;
val3不是成員變數,它只是函式fcn內部的區域性變數;
val4和val5也都不是成員變數,雖是以self.給出,但並沒有在建構函式中初始化。
再看看下面的**(#號後面的是執行結果):
[python]
view plain
copy
inst1 = testclass()
inst2 = testclass()
testclass.val1
# 100
inst1.val1
# 100
inst1.val1 = 1000
inst1.val1
# 1000
testclass.val1
# 100
testclass.val1 =2000
inst1.val1
# 1000
testclass.val1
# 2000
inst2.val1
# 2000
inst3 = testclass()
inst3.val1
# 2000
可以發現:python的類變數和c++的靜態變數不同,區別在於python的物件使用類變數時,會進行一次記憶體拷貝。python中,類本身擁有自己的類變數(儲存在記憶體),當物件第一次呼叫類變數時,會將當前類變數拷貝乙份給這個物件,當前類變數的值是多少,這個物件拷貝得到的類變數的值就是多少;而且,通過物件來修改類變數,並不會影響其他物件的類變數的值,因為大家都有各自的副本,更不會影響類本身所擁有的那個類變數的值;只有類自己才能改變類本身擁有的類變數的值。
有一點值得注意:物件的類變數是什麼時候初始化的(從類的類變數拷貝過來)?通過上例中inst2.val1的列印結果是2000可以發現,物件的類變數並不是構造物件的時候初始化的,而是在第一次通過物件呼叫該類變數的時候從類變數當前的值拷貝過來的。此後便互不影響。
Python類變數和成員變數
先上一段 class test x num 4 num 1 y 5 def init self,num self.num num defchange self,num test.num num test.x num 21 deftest self self.x 12 self.y 15 a test...
類的成員變數和例項變數
class classout out mem out mem def init self inner mem inner mem self.inner mem self.inner mem self.inner mem self.inner mem self.out mem self.out mem...
成員變數和類變數的區別
由static修飾的變數成為靜態變數,其實質上就是乙個全域性變數。如果某個內容是被所有物件所共享,那麼該內容就應該用靜態修飾 沒有被靜態修飾的內容,其實是屬於物件的特殊描述。不同的物件的是例項變數將被分配不同的記憶體空間,如果類的成員變數有類變數,那麼所有都物件的這個類變數都分配給相同的一處記憶體 ...