類對(duì)象
創(chuàng)建一個(gè)類颠放,其實(shí)也是一個(gè)對(duì)象也在內(nèi)存開辟了一塊空間排惨,稱為類對(duì)象,類對(duì)象只有一個(gè)碰凶。
# 類對(duì)象
class A(object):
pass
實(shí)例對(duì)象
就是通過實(shí)例化類創(chuàng)建的對(duì)象暮芭,稱為實(shí)例對(duì)象,實(shí)例對(duì)象可以有多個(gè)欲低。
# 實(shí)例化對(duì)象 a辕宏、b、c都屬于實(shí)例對(duì)象砾莱。
a = A()
b = A()
c = A()
類屬性
類里面方法外面定義的變量稱為類屬性瑞筐。
類屬性所屬于類對(duì)象并且多個(gè)實(shí)例對(duì)象之間共享同一個(gè)類屬性,
說白了就是類屬性所有的通過該類實(shí)例化的對(duì)象都能共享。
class A():
a = xx #類屬性
def __init__(self):
A.a = xx #使用類屬性可以通過 (類名.類屬性)調(diào)用腊瑟。
實(shí)例屬性
實(shí)例屬性和具體的某個(gè)實(shí)例對(duì)象有關(guān)系聚假,并且一個(gè)實(shí)例對(duì)象和另外一個(gè)實(shí)例對(duì)象是不共享屬性的,
說白了實(shí)例屬性值能在自己的對(duì)象里面使用扫步,其他的對(duì)象不能直接使用魔策,因?yàn)閟elf是誰調(diào)用,他的值就屬于該對(duì)象河胎。
class 類名():
__init__(self):
self.name = xx #實(shí)例屬性
類屬性和實(shí)例屬性區(qū)別
# 創(chuàng)建類對(duì)象
class Test(object):
class_attr = 100 # 類屬性
def __init__(self):
self.sl_attr = 100 # 實(shí)例屬性
def func(self):
print('類對(duì)象.類屬性的值:',Test.class_attr) # 調(diào)用類屬性
print('self.類屬性的值',self.class_attr) # 相當(dāng)于把類屬性 變成實(shí)例屬性
print('self.實(shí)例屬性的值',self.sl_attr) # 調(diào)用實(shí)例屬性
# 創(chuàng)建a對(duì)象
a = Test()
a.func()
運(yùn)行結(jié)果:
類對(duì)象.類屬性的值: 100
self.類屬性的值 100
self.實(shí)例屬性的值 100
# 創(chuàng)建b對(duì)象
b = Test()
b.func()
運(yùn)行結(jié)果:
類對(duì)象.類屬性的值: 100
self.類屬性的值 100
self.實(shí)例屬性的值 100
# 通過(實(shí)例對(duì)象.類屬性)修改類屬性
a.class_attr = 200
# 通過(實(shí)例對(duì)象.實(shí)例屬性)修改實(shí)例屬性的值
a.sl_attr = 200
a.func()
運(yùn)行結(jié)果:
類對(duì)象.類屬性的值: 100
self.類屬性的值 200
self.實(shí)例屬性的值 200
# 再次運(yùn)行b對(duì)象
b.func()
運(yùn)行結(jié)果:
類對(duì)象.類屬性的值: 100
self.類屬性的值 100
self.實(shí)例屬性的值 100
# 通過(類對(duì)象.類屬性)修改類屬性
Test.class_attr = 300
a.func()
運(yùn)行結(jié)果:
類對(duì)象.類屬性的值: 300
self.類屬性的值 200
self.實(shí)例屬性的值 200
# 此時(shí)再執(zhí)行b對(duì)象
b.func()
運(yùn)行結(jié)果:
類對(duì)象.類屬性的值: 300
self.類屬性的值 300
self.實(shí)例屬性的值 100
類方法
在方法前面加上@classmethod 這樣的方法稱為類方法闯袒,類方法可以修改類屬性的值。
實(shí)例方法
帶有self的都是實(shí)例方法。
靜態(tài)方法
靜態(tài)方法可以不加self參數(shù)政敢,一般只完成些既和類對(duì)象也和實(shí)例對(duì)象沒有關(guān)聯(lián)的基本功能其徙,如一些打印功能。
總結(jié)
1.類屬性:類外面喷户,可以通過實(shí)例對(duì)象.類屬性
和類名.類屬性
進(jìn)行調(diào)用唾那。類里面,通過self.類屬性
和類名.類屬性
進(jìn)行調(diào)用褪尝。
2.實(shí)例屬性 :類外面闹获,可以通過實(shí)例對(duì)象.實(shí)例屬性
調(diào)用。類里面河哑,通過self.實(shí)例屬性
調(diào)用避诽。
3.實(shí)例屬性就相當(dāng)于局部變量。出了這個(gè)類或者這個(gè)類的實(shí)例對(duì)象璃谨,就沒有作用了沙庐。
4.類屬性就相當(dāng)于類里面的全局變量,可以和這個(gè)類的所有實(shí)例對(duì)象共享佳吞。
5.類方法修改類屬性拱雏,實(shí)例方法修改實(shí)例屬性,靜態(tài)方法和他們都沒有關(guān)聯(lián)的時(shí)候使用底扳,也就是不需要傳參的時(shí)候使用铸抑。
單例對(duì)象
先記錄下
class A(object):
#用類屬性用來標(biāo)識(shí)是否是第一次創(chuàng)建對(duì)象
__ins = None
def __new__(cls):
#如果是第一次創(chuàng)建對(duì)象就把該對(duì)象的引用保存到__ins內(nèi)
if cls.__ins == None:
cls.__ins = object.__new__(cls)
#返回第一次創(chuàng)建對(duì)象的引用
return cls.__ins
else:
#返回上一次創(chuàng)建的對(duì)象的引用
return cls.__ins
a = A()
b = A()
print (id(a))
print (id(b))
運(yùn)行結(jié)果
18991816
18991816