面向對象編程要解決的根本問題之一是實現代碼複用,經過抽象出一類邏輯的行爲以及屬性來實現複用的目的,具體邏輯經過繼承基類重寫方法配置屬性實現實例個性化python
Python 類的繼承算法
代碼:編程
#!/usr/bin/env python # -*- coding: utf-8 -*- # time @2016/3/7 11:28 create by JasonYang class Animal(object): def __init__(self, name): self.name = name print "小動物 %s 出生了" % name def eat(self): pass def sleep(self): pass def live(self): self.eat() self.sleep() class Pig(Animal): def __init__(self, name): self.name = name super(self.__class__, self).__init__(name) def eat(self): print '%s 吃糧食' % self.name def sleep(self): print '%s 趴着睡' % self.name class Horse(Animal): def __init__(self, name): self.name = name print self.__class__ super(self.__class__, self).__init__(name) def eat(self): print '%s 吃青草' % self.name def sleep(self): print '%s 站着睡' % self.name if __name__ == '__main__': pig = Pig('pig') horse = Horse('horse') pig.live() horse.live()
結果:函數
D:\Python27\python.exe E:/workspace/jjww/src/main.py 小動物 pig 出生了 <class '__main__.Horse'> 小動物 horse 出生了 pig 吃糧食 pig 趴着睡 horse 吃青草 horse 站着睡 Process finished with exit code 0
在編碼過程當中常常會用到class,可是去看寫過的代碼,其中用class的地方不少的都是將class單純地用做一種屬性和方法的集合,而忽視了class中「行爲」與「繼承」的使用方法。編碼
在一個可以抽象出行爲邏輯的功能中,若是得當的使用class,在基類中抽象出」行爲「在繼承基類的子類中定義或實現特殊(或意爲特例)的屬性或方法,這可以很好的爲代碼解耦,同時一個基類可以描述一類行爲,而對於行爲的特殊實例只須要定製子類就可以實現需求。因此合理有效的使用面向對象的方式方法可以有效的組織代碼、減小編碼量,使代碼便於維護便於改動spa
注: class A(object): 這種類型的定義是新類的定義方法,支持super(type,self).__init__(params)這種形式的調用,若是定義類型 爲 class A: 這種形式則會在調用super函數的地方報錯,第二種類的定義方法是舊類code
與類相關的一些模式:對象
模板方法模式:在一個方法中定義一個算法骨架,並將一些實現逐步延遲到子類中[1],一種思路就是在父類中定義各個方法執行順序(算法)。在子類中重載方法,實現定製..繼承
參考文獻:utf-8
[1].《編寫高質量python代碼》 張穎,賴勇浩著,機械工業出版社 P132