1.類的繼承
類的繼承
繼承是面向對象的重要特性之一,
繼承關系繼承是相對兩個類而言的父子關系
子類繼承了父類的所有公有屬性和方法,
繼承,實作了代碼重用
使用繼承
繼承可以重用已經存在的資料和行為,減少代碼的重複編寫,
Python在類名後使用一對括号來表示繼承關系,括号中的即類為父類
class Myclass(ParentClass),
如果父類定義了__init__方法,子類必須顯式調用父類的__init__方法,
ParentClass.__init__(self,[args...])
如果子類需要擴充父類的行為,可以添加__init__方法的參數.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<code>#!/usr/bin/env python</code>
<code>#-*- coding:utf-8 -*-</code>
<code>class</code> <code>People(</code><code>object</code><code>):</code>
<code> </code><code>color </code><code>=</code> <code>'yellow'</code>
<code> </code>
<code> </code><code>def</code> <code>think(</code><code>self</code><code>):</code>
<code> </code><code>self</code><code>.color </code><code>=</code> <code>"black"</code>
<code> </code><code>print</code> <code>"I am a %s "</code> <code>%</code> <code>self</code><code>.color</code>
<code> </code><code>print</code> <code>(</code><code>"I am a thinker"</code><code>)</code>
<code>class</code> <code>Chinese(People):</code>
<code> </code><code>pass</code>
<code>cn </code><code>=</code> <code>Chinese()</code>
<code>print</code> <code>cn.color</code>
<code>cn.think()</code>
父類中有構造函數:
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>"Init..."</code>
<code> </code><code>self</code><code>.dwell </code><code>=</code> <code>'Earth'</code>
<code> </code><code>print</code> <code>"I am a %s "</code> <code>%</code> <code>self</code><code>.color</code>
<code> </code><code>print</code> <code>(</code><code>"I am a thinker"</code><code>)</code>
<code>print</code> <code>cn.dwell</code>
參數大于兩個:
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>,c):</code>
<code> </code><code>def</code> <code>think(</code><code>self</code><code>):</code>
<code> </code><code>People.__init__(</code><code>self</code><code>,</code><code>'red'</code><code>)</code>
<code> </code><code>pass</code>
Super 函數
<code>class</code> <code>A(</code><code>object</code><code>):</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>"enter A"</code>
<code> </code><code>print</code> <code>"leave A"</code>
<code>class</code> <code>B(</code><code>object</code><code>):</code>
<code> </code><code>print</code> <code>"enter B"</code>
<code> </code><code>super</code><code>(B,</code><code>self</code><code>),__init__()</code>
<code> </code><code>print</code> <code>"leave B"</code>
<code>b </code><code>=</code> <code>B()</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>
<code> </code><code>super</code><code>(Chinese,</code><code>self</code><code>).__init__(</code><code>'red'</code><code>)</code>
<code> </code><code>pass</code>
17
18
<code> </code><code>super</code><code>(Chinese,</code><code>self</code><code>).__init__(</code><code>'red'</code><code>)</code>
<code> </code><code>def</code> <code>talk(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>"I like taking."</code>
<code>cn.talk()</code>
多重繼承
Python支援多重繼承,第一個類可以繼承多個父類
文法:
class class_name(Parent_c1,Parent_c2,...)
注意:
當父類中出現多個自定義的__init__的方法時,
多重繼承,隻執行第一個累的__init_方法,其他不執行。
19
<code> </code><code>print</code> <code>(</code><code>"My home is %s "</code><code>) </code><code>%</code> <code>self</code><code>.dwell</code>
<code>class</code> <code>Martian(</code><code>object</code><code>):</code>
<code> </code><code>color </code><code>=</code> <code>'red'</code>
<code> </code><code>self</code><code>.dwell </code><code>=</code> <code>'Martian'</code>
<code>class</code> <code>Chinese(People,Martian):</code>
<code> </code><code>People.__init__(</code><code>self</code><code>)</code>
20
21
<code> </code><code>self</code><code>.color </code><code>=</code> <code>'yellow'</code>
<code> </code><code>def</code> <code>talk(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>"I like talking"</code>
<code>class</code> <code>Chinese(Martian,People):</code>
3.類的屬性總結
類屬性,也是公有屬性,
類的私有屬性,
對象的共有屬性,
對象的私有屬性,
内置屬性,
函數的局部變量,
全局變量,
<code>#/usr/bin/env python</code>
<code># -*- coding:utf-8 -*-</code>
<code>class</code> <code>MyClass(</code><code>object</code><code>):</code>
<code> </code><code>var1 </code><code>=</code> <code>'類屬性,類的公有屬性 var1'</code>
<code> </code><code>__var2 </code><code>=</code> <code>'類的私有屬性 __var2'</code>
<code> </code><code>def</code> <code>func1(</code><code>self</code><code>):</code>
<code> </code><code>self</code><code>.var3 </code><code>=</code> <code>'對象的公有屬性 var3'</code>
<code> </code><code>self</code><code>.__var4 </code><code>=</code> <code>'對象的私有屬性 __var4'</code>
<code> </code><code>var5 </code><code>=</code> <code>'函數的局部變量'</code>
<code>mc </code><code>=</code> <code>MyClass()</code>
<code>mc.func1() </code><code>#調用後才測列印出var3</code>
<code>print</code> <code>mc.var1</code>
<code>print</code> <code>mc._MyClass__var2</code>
<code>print</code> <code>mc.var3</code>
<code>mc1 </code><code>=</code> <code>MyClass()</code>
<code># mc1.func1() #mc1沒有調用方法</code>
<code>print</code> <code>mc1.var3</code>
通過類通路:
22
23
24
25
26
27
28
29
30
<code> </code><code>#/usr/bin/env python</code>
<code> </code><code># -*- coding:utf-8 -*-</code>
<code> </code><code># @time :2018/1/2 21:06</code>
<code> </code><code># @Author :FengXiaoqing</code>
<code> </code><code># @file :__init__.py.py</code>
<code> </code><code>#</code>
<code> </code><code>var6 </code><code>=</code> <code>'全局變量 '</code>
<code> </code><code>class</code> <code>MyClass(</code><code>object</code><code>):</code>
<code> </code><code>var1 </code><code>=</code> <code>'類屬性,類的公有屬性 var1'</code> <code>##定義在方法外</code>
<code> </code><code>self</code><code>.var3 </code><code>=</code> <code>'對象的公有屬性 var3'</code> <code>##定義在方法内</code>
<code> </code><code>def</code> <code>func2(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>self</code><code>.var1</code>
<code> </code><code>print</code> <code>self</code><code>.__var2</code>
<code> </code><code>print</code> <code>self</code><code>.var3</code>
<code> </code><code>print</code> <code>self</code><code>.__var4</code>
<code> </code><code>print</code> <code>self</code><code>.var6</code>
<code> </code><code>mc </code><code>=</code> <code>MyClass()</code>
<code> </code><code>mc.func1()</code>
<code> </code><code>mc.func2()</code>
<code> </code><code>print</code> <code>'*'</code><code>*</code><code>50</code>
<code> </code><code>print</code> <code>mc.__dict__</code>
<code> </code><code>print</code> <code>MyClass.var1</code>
<code> </code><code>#print MyClass.__var2 #不測通過類通路</code>
<code> </code><code>print</code> <code>mc.var3 </code><code>#對象的屬性隻能通過對象來通路</code>
<code> </code><code>#print MyClass.__var4</code>
<code> </code><code>print</code> <code>MyClass.__dict__</code>
4.類的方法總結
公有方法
私有方法
類方法
靜态方法
内置方法
<code> </code><code>name </code><code>=</code> <code>'Test'</code>
<code> </code><code>def</code> <code>func1(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>self</code><code>.name,</code>
<code> </code><code>print</code> <code>"我是公有方法."</code>
<code> </code><code>self</code><code>.__func2() </code><code>#func1間接調用了func2的私有方法</code>
<code> </code><code>def</code> <code>__func2(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>"我是私有方法."</code>
<code> </code><code>def</code> <code>classFun(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>"我是類方法."</code>
<code> </code><code>def</code> <code>staticFun(</code><code>self</code><code>):</code>
<code> </code><code>print</code> <code>s.name,</code>
<code> </code><code>print</code> <code>"我是靜态方法."</code>
<code>mc.func1()</code>
調用類方法:用裝飾器
<code> </code><code>@</code><code>classmethod</code>
<code>MyClass.classFun()</code>
調用靜态方法:
<code> </code><code>@</code><code>staticmethod</code>
<code> </code><code>def</code> <code>staticFun():</code>
<code> </code><code>print</code> <code>MyClass.name, </code>
<code>MyClass.staticFun()</code>
調用内置方法:
<code> </code><code>self</code><code>.func1()</code>
<code> </code><code>self</code><code>.__func2()</code>
<code> </code><code>self</code><code>.classFun()</code>
<code> </code><code>self</code><code>.staticFun()</code>
<code> </code><code>print</code> <code>MyClass.name,</code>
版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任
本文轉自 楓葉雲 51CTO部落格,原文連結:http://blog.51cto.com/fengyunshan911/2060037