面向對象最重要的概念應該就是類(class)和實例(instance)了。記得之前學習java的時候,有一個比較簡單的例子來解釋類和實例。
在汽車製造過程當中,咱們須要先設計圖紙,讓後再根據圖紙來製造實際的汽車。類就至關於圖紙,而實例則是實際的汽車。一張圖紙能夠造出不少汽車,剛造出的汽車是同樣的,可是後續能夠進行個性化的改裝。
python能夠根據class在內存中建立多個實例,每一個實例能夠獨立地添加和修改方法和屬性。java
class Car(Vehicle): pass
咱們來講明一下,class
關鍵詞來聲明這是一個類,緊接着就是類名。後接一個()
,裏面是該類所繼承的父類。
在2.7中,一個類若是沒有繼承其它類,則能夠另其繼承object
類。那麼這樣定義的就是一個new style object
,即新式類。
若是不聲明繼承自何類,那麼定義的則是經典類。
例如:python
# 定義新式類 class Student(object): pass # 定義經典類 class Student2: pass
新式類和經典類的區別出了寫法不同外,還存在其它區別:函數
新式類的類型是type
,經典類的類型是classobj
。新式類的出現就是爲了將全部類的類型統一爲type
。學習
對於多繼承,繼承搜索的順序發生了改變。(這裏不懂)設計
默認屬性發生了改變code
可能還有其它對象
Python 3.x以上版本全部的類均是新式類,不須要顯式地繼承object
。繼承
類中能夠定義一個構造函數__init__
。構造函數的意思就是類在建立的時候會執行的函數。__init__
函數的第一參數是self
,指實例自己。__init__
函數還能夠有多個參數,這些參數須要在實例建立的時候傳入。
例如:內存
class Student(object): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender
__init__
函數常常用於對實例屬性進行初始化。get
類中的函數也叫作方法。方法與其它函數有所區別,即方法的第一個參數永遠是self
,即實例自己。
建立實例後,在調用方法是,並不須要傳入實例,由於編譯器爲自動爲咱們加入實例。例如:
class Student(object): def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender # 方法的第一個參數是self def print_name(self): print self.name student = Student("charlie", 20, 'male') #調用函數的時候,並不須要手動傳入實例student student.print_name()
classmethod和staticmethod。
簡單粗淺地說,能夠理解成:
classmethod的是定義一些僅僅跟類有關,可是跟實例無關的方法。
staticmethod是一些跟類有關係的功能,可是其具體的實現卻又不須要用到類或者實例的參與。staticmethod叫作靜態方法。
更多解釋和例子,能夠閱讀知乎上的回答:https://www.zhihu.com/questio...
屬性就更加好理解了。
例如咱們設計一張製造冰箱的圖紙,咱們除了定義冰箱的功能(類的方法)外,還須要定義冰箱的顏色、長、寬、高、等屬性。類也同樣。
class Fridge(object): color = 'yellow' height = 120 width = 30 food = 'fish' def storage(self): print "keep %s fresh" % self.food fridge = Fridge() fridge.storage()
上面咱們講了這麼多類的特性,其實類就是一個數據類型。咱們把一種數據類型封裝成一個類。
例如一個學生具備姓名、年齡、性別等屬性,另外他也有書寫姓名、讀書識字等功能。咱們能夠把一個Student全部的屬性和功能當作一個總體,那麼這就是一個類。這個類就是與python中內置的其它數據類型同樣的數據類型,只不過這是咱們自定義的,叫Student。
建立實例的方法十分簡單。即:
student = Student(括號內傳入在__init__函數中定義的參數)
python是一門動態語言。建立好的實例能夠自由地添加屬性。在類中聲明的read-only的屬性,在實例中不能del。在實例中經過構造函數添加的或者在類外動態添加的屬性能夠del。
類中的read-only屬性只能經過類屬性的形式刪除。
class Fridge(object): color = "yellow" width = 20 def __init__(self, height): self.height = height def storage(self): print "keep %s fresh" fridge = Fridge(100) fridge.name = "Haier" del fridge.color # AttributeError 報錯 del fridge.height del fridge.name del Fridge.width
怎麼給實例或類動態添加方法?先挖個坑,學習了再寫。