2018.12.5python筆記(3.0-3.2)
Python內部類(類的嵌套)
所謂內部類,就是在類的內部定義的類,主要目的是為了更好的抽象現實世界。
例子:
汽車是個類,汽車的底盤,輪胎也可以抽象為類,將其定義到汽車類中,則形成內部類,更好的描述汽車類,因為底盤、輪胎是汽車的一部分。
比如os.path. path就是os中的內部類
創建內部類
#!/usr/bin/python
class People(object):
color = ‘Yellow‘
__age = 30
class Chinese(object): 內部類
print "I am chinese"
def think(self): print "I am a thinker" self.color=‘black‘ print "I am %s man" % self.color print self.__age @classmethod def test(self): print ‘this is func‘ def __talk(self): print "I am talking with Tom"
jack = People()
People.test()
內部類的實例化方法
方法1:直接使用外部類調用內部類
object_name = outclass_name.inclass_name()
class People(object):
color = ‘Yellow‘
__age = 30
class Chinese(object):
name = "I am chinese"
jack = People.Chinese() 內部類實例化
print jack.name 實例化後可以訪問內部類的屬性
方法2:先對外部類進行實例化,然後再實例化內部類
out_name = outclass_name() 先實例化外部類
in_name.method() 使用實例化後的對象訪問內部類中的方法
ren = People()
jack = ren.Chinese()
print jack.name
或者 使用 People.Chinese.name(或者People.Chinese().name) 直接訪問類的屬性
類的內置方法(魔術方法) 雙下劃線開頭結尾
str(self)
def str(self): 重新定義內置方法
return "this is People class" 只能用return 不能使用print
構造函數與析構函數
-
構造函數:
用於初始化類的內部狀態,Python提供的構造函數是init();
init()方法是可選的,如果不提供,Python會給出一個默認的init方法
def init(self): 自定義構造函數
self.color="black" 將類的屬性重新初始化
ren = People()
ren.color 將打印black
People.color 還是打印yellow
構造函數只在類實例化的時候自動執行
通常可以去傳個參數 init(self,c=‘white‘)
ren = People(‘green‘)
ren.color 將打印green
也可以在init中調用方法 這樣實例化的時候直接調用方法- 析構函數:
用於釋放對象占用的資源,Python提供的析構函數是del();
del()也是可選的,如果不提供,則Python會在後臺提供默認析構函數,一般在腳本最後執行
python 有垃圾回收機制
垃圾回收機制
Python采用垃圾回收機制來清理不再使用的對象;python提供gc模塊釋放不再使用的對象。
Python采用”引用計數”的算法方式來處理回收,即:當某個對象在其作用域內不再被其他對象引用的時候,python就自動清除對象;
gc模塊的collect()可以一次性收集所有待處理的對象(gc.collect)
- 析構函數:
3.1(2) 類的繼承
繼承是面向對象的重要特性之一;
繼承關系:繼承是相對兩個類而言的父子關系,子類繼承了父類的所有公有屬性和方法
繼承實現了代碼重用。
繼承可以重用已經存在的數據和行為,減少代碼的重復編寫。Python在類名後使用一對括號來表示繼承關系,括號中的類即為父類。
class Myclass(ParentClass)
如果父類定義了init方法,子類必須顯式調用父類的init方法:
ParentClass.init(self, [args…])
如果子類需要擴展父類的行為,可以添加init方法的參數。
#!/usr/bin/python
class People(object):
color = ‘Yellow‘
def init(self): 定義構造函數
self.dwell = ‘Earth‘
def think(self):
print "I am a thinker"
print "I am %s man" % self.color
class Chinese(People): 定義子類,括號內聲明父類的名字
pass
cn = Chinese() 子類實例化
print cn.color 子類實例可以訪問父類屬性
print cn.dwell 子類實例訪問父類構造方法中的屬性
如果init(self,c)有第二個參數,子類實例就無法直接調用,必須在子類中重寫init函數
class Chinese(People):
def init(self):
People.init(self,‘white‘) 重寫父類init函數
super函數 也可以取繼承父類
class A(object):
def init(self):
print "enter A"
print "leave A"
class B(A):
def init(self):
print "enter B"
super(B, self).init()
print "leave B"
b = B()
class Chinese(People):
def init(self):
#super(Chinese,self).init(‘red‘) 註意這裏後面不用再寫self了
People.init(self,‘red‘)
子類也可以定義自己的方法和修改父類的方法
class Chinese(People):
def init(self):
#super(Chinese,self).init(‘red‘)
People.init(self,‘red‘)
def talk(self): 定義子類自己的方法
print "I like talking"
def think(self): 修改父類的方法
print ...
Python支持多重繼承,即一個類可以繼承多個父類;
語法:
class class_name(Parent_c1, Parent_c2,…)
註意:
當父類中出現多個自定義的init方法時,多重繼承只執行第一個類的init方法,其他不執行。
#!/usr/bin/python
class People(object):
color = ‘Yellow‘
def __init__(self,c):
self.dwell = ‘Earth‘
print c
def think(self):
print "My home is %s" % self.dwell
print "I am %s man" % self.color
class Martian(object):
color = ‘red‘
def init(self):
self.dwell=‘Martian‘
class Chinese(Martian,People): 哪個父類寫在前面就用誰的方法,除非自定義方法
pass
cn = Chinese()
cn.think()
只繼承一個類比較常用
2018.12.5python筆記(3.0-3.2)