1. 程式人生 > >2018.12.5python筆記(3.0-3.2)

2018.12.5python筆記(3.0-3.2)

ack assm 抽象 一個 str 實現 修改 方法 開頭

3.0 類的內置方法
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 = out_name.inclass_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)