天天看點

2Python全棧之路系列之面向對象進階及類成員

先來一段代碼

<code>#!/usr/bin/env python</code>

<code># _*_ coding:utf-8 _*_</code>

<code>class</code> <code>A:</code>

<code>    </code><code>def</code> <code>bar(</code><code>self</code><code>):</code>

<code>        </code><code>print</code><code>(</code><code>"BAR"</code><code>)</code>

<code>        </code><code>self</code><code>.f1()</code>

<code>        </code> 

<code>class</code> <code>B(A):</code>

<code>    </code><code>def</code> <code>f1(</code><code>self</code><code>):</code>

<code>        </code><code>print</code><code>(</code><code>"B"</code><code>)</code>

<code>class</code> <code>C:</code>

<code>        </code><code>print</code><code>(</code><code>"C"</code><code>)</code>

<code>class</code> <code>D(C, B):</code>

<code>    </code><code>pass</code>

<code>    </code> 

<code>obj </code><code>=</code> <code>D()</code>

<code>obj.bar()</code>

執行結果

<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文檔</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day03</code><code>/</code><code>s1.py</code>

<code>BAR</code>

<code>C</code>

<code>Process finished with exit code </code><code>0</code>

流程釋意:

建立了類A、B、C、D;

<code>D</code>繼承了<code>C</code>和<code>B</code>,<code>B</code>繼承了<code>A</code>,<code>D</code>内什麼都不做,<code>pass</code>;

建立一個對象<code>obj</code>,類是<code>D</code>,當執行<code>D</code>的<code>bar</code>方法的時候會先從<code>C</code>裡面尋找有沒有<code>bar</code>方法;

<code>C</code>内沒有<code>bar</code>方法,然後繼續從<code>B</code>裡面查找,<code>B</code>裡面也沒有,<code>B</code>的父類是<code>A</code>,<code>A</code>裡面有<code>bar</code>方法,是以就執行了<code>A</code>的<code>bar</code>方法;

<code>A</code>的<code>bar</code>方法首先輸出了<code>BAR</code>;

然後又執行了<code>self.f1()</code>,<code>self</code>=<code>obj</code>,相當于執行了<code>obj.f1()</code>;

執行<code>obj.f1()</code>的時候先從<code>C</code>裡面查找有沒有<code>f1</code>這個方法,<code>C</code>裡面又<code>f1</code>這個方法;

最後就執行<code>C</code>裡面的<code>f1</code>方法了,輸出了<code>C</code>

<code>class</code> <code>Annimal:</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>

<code>        </code><code>print</code><code>(</code><code>"Annimal的構造方法"</code><code>)</code>

<code>        </code><code>self</code><code>.ty </code><code>=</code> <code>"動物"</code>

<code>class</code> <code>Cat(Annimal):</code>

<code>        </code><code>print</code><code>(</code><code>"Cat的構造方法"</code><code>)</code>

<code>        </code><code>self</code><code>.n </code><code>=</code> <code>"貓"</code>

<code>        </code><code># 尋找Cat類的父類,然後執行父類的構造方法</code>

<code>        </code><code>super</code><code>(Cat, </code><code>self</code><code>).__init__()</code>

<code>mao </code><code>=</code> <code>Cat()</code>

<code>print</code><code>(mao.__dict__)</code>

<code>Cat的構造方法</code>

<code>Annimal的構造方法</code>

<code>{</code><code>'ty'</code><code>: </code><code>'動物'</code><code>, </code><code>'n'</code><code>: </code><code>'貓'</code><code>}</code>

先執行了Cat的構造方法,然後又執行了Annimal的構造方法。

第二種執行父類的方法如下:

<code>Annimal.__init__(</code><code>self</code><code>)</code>

不推薦使用

<code>class</code> <code>Foo:</code>

<code>    </code><code>def</code> <code>__init__(</code><code>self</code><code>, name):</code>

<code>        </code><code>self</code><code>.name </code><code>=</code> <code>name</code>

<code>    </code><code>def</code> <code>show(</code><code>self</code><code>):</code>

<code>        </code><code>print</code><code>(</code><code>'show'</code><code>)</code>

<code>obj </code><code>=</code> <code>Foo(</code><code>"as"</code><code>)</code>

<code># 如果是類,就隻能找到類裡的成員</code>

<code>print</code><code>(</code><code>hasattr</code><code>(Foo, </code><code>"show"</code><code>))</code>

<code># 如果是對象,既可以找到對象,也可以找類裡的成員</code>

<code>print</code><code>(</code><code>hasattr</code><code>(obj, </code><code>"name"</code><code>))</code>

<code>print</code><code>(</code><code>hasattr</code><code>(obj, </code><code>"show"</code><code>))</code>

<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文檔</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day03</code><code>/</code><code>s2.py</code>

<code>True</code>

<code>s1</code>腳本檔案内容:

<code># _*_coding:utf-8 _*_</code>

<code># 導入子產品</code>

<code>m </code><code>=</code> <code>__import__</code><code>(</code><code>'s2'</code><code>, fromlist</code><code>=</code><code>True</code><code>)</code>

<code># 去子產品中找類</code>

<code>class_name </code><code>=</code> <code>getattr</code><code>(m, </code><code>"Foo"</code><code>)</code>

<code># 根據類建立對象</code>

<code>obj </code><code>=</code> <code>class_name(</code><code>"ansheng"</code><code>)</code>

<code># 去對象中找name對應的值</code>

<code>print</code><code>(</code><code>getattr</code><code>(obj, </code><code>'name'</code><code>))</code>

<code>s2</code>腳本檔案内容

<code>        </code><code># 普通字段,儲存在對象中</code>

執行結果:

<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文檔</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day04</code><code>/</code><code>s1.py</code>

<code>ansheng</code>

靜态字段存在類中,如下:

<code># 靜态字段存在的意義就是将每個對象中重複的東西在類裡面儲存一份即可,這就是靜态字段</code>

<code>class</code> <code>Provice:</code>

<code>    </code><code># 靜态字段</code>

<code>    </code><code>contry </code><code>=</code> <code>"China"</code>

<code>        </code><code>print</code><code>(Provice.contry, </code><code>self</code><code>.name)</code>

<code>hebei </code><code>=</code> <code>Provice(</code><code>"河北"</code><code>)</code>

<code>hebei.show()</code>

<code>hubei </code><code>=</code> <code>Provice(</code><code>"湖北"</code><code>)</code>

<code>hubei.show()</code>

<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文檔</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day04</code><code>/</code><code>s2.py</code>

<code>China 河北</code>

<code>China 湖北</code>

類裡面的成員類去通路,對象内的成員用對象去通路。

<code>    </code><code># 靜态方法括号内沒有self,切方法前一行要加上@staticmethod</code>

<code>    </code><code>@</code><code>staticmethod</code>

<code>    </code><code>def</code> <code>static():</code>

<code>    </code><code># def static(arg1, arg2): # 也可以設定參數</code>

<code>        </code><code>print</code><code>(</code><code>"static"</code><code>)</code>

<code># 靜态方法通過類名+方法名既可執行</code>

<code>Foo.static()</code>

<code># Foo.static("arg1", "arg2") 通過類調用的時候傳入對于的參數即可</code>

<code># 靜态方法也可以通過對象去通路,對于靜态方法用類去通路</code>

<code>obj </code><code>=</code> <code>Foo()</code>

<code>obj.static(</code>

<code>    </code><code># 建立類方法的時候需要在方法前面加上@classmethod</code>

<code>    </code><code>@</code><code>classmethod</code>

<code>    </code><code>def</code> <code>ClassMethod</code><code>(</code><code>cls</code><code>): </code><code># 并且方法的括号内必須帶有cls關鍵字,類方法的參數是目前類的類名</code>

<code>        </code><code>print</code><code>(</code><code>"類方法"</code><code>)</code>

<code># 調用類方法</code>

<code>Foo.</code><code>ClassMethod</code><code>()</code>

<code>類方法</code>

字段

1.靜态字段(每個對象都有一份)

2.普通字段(每個對象都不同的資料)

方法

1.靜态方法(無需使用對象封裝的内容)

2.類方法

3.普通方法(适用對象中的資料)

特性

1.普通特性(将方法未造成字段)

快速判斷,類執行、對象執行:

1.self —&gt; 對象調用

2.無self —&gt; 類調用

本文轉自 Edenwy  51CTO部落格,原文連結:http://blog.51cto.com/edeny/1917743,如需轉載請自行聯系原作者