搜尋
首頁後端開發Python教學Python是物件導向

Python是物件導向

Nov 23, 2016 pm 02:09 PM
python

Python從設計之初就已經是一門物件導向的語言,正因為如此,在Python中創建一個類別和物件是很容易的。本章節我們將詳細介紹Python的物件導向程式設計。

如果你以前沒有接觸過物件導向的程式語言,那你可能需要先了解一些物件導向語言的一些基本特徵,在頭腦裡頭形成一個基本的物件導向的概念,這樣有助於你更容易的學習Python的物件導向程式設計。

接下來我們先來簡單的了解下面向對象的一些基本特徵。

物件導向技術簡介

類別(Class): 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類別的實例。

類別變數:類別變數在整個實例化的物件中是公用的。類別變數定義在類別中且在函數體之外。類別變數通常不作為實例變數使用。

資料成員:類別變數或實例變數用於處理類別及其實例物件的相關的資料。

方法重載:如果從父類別繼承的方法不能滿足子類別的需求,可以對其進行改寫,這個過程叫方法的覆寫(override),也稱為方法的重載。

實例變數:定義在方法中的變量,只作用於目前實例的類別。

繼承:即 一個衍生類別(derived class)繼承基底類別(base class)的欄位和方法。繼承也允許把一個衍生類別的物件當作一個基底類別物件。例如,有這樣一個設計:一個Dog類型的物件派生自Animal類,這是 模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。

實例化:建立一個類別的實例,類別的具體物件。

方法:類別中定義的函數。

物件:透過類別定義的資料結構實例。物件包括兩個資料成員(類別變數和實例變數)和方法。

建立類別

使用class語句來建立一個新類別,class之後為類別的名稱並以冒號結尾,如下實例:

class ClassName:

類串

   class_suite  #類體

   

類的幫助資訊可以透過ClassName.__doc__檢視。

class_suite 由類別成員,方法,資料屬性組成。

實例

以下是一個簡單的Python類別實例:

class Employee:

   'Common base class for Count.

   def __init__(self, name, salary ):

      self.name = name

      self.salary = salary

=     def displayCount(self):

     print "Total Employee %d" % Employee.empCount

 

   def displayEmployee(self):

      print "Name : ", self.name,  ", Salary: ", self.salary的所有實例之間共用。你可以在內部類別或外部類別使用Employee.empCount存取。

第一種方法__init__()方法是一種特殊的方法,被稱為類別的建構函式或初始化方法,當建立了這個類別的實例時就會呼叫該方法

建立實例物件

要建立一個類別的實例,你可以使用類別的名稱,並透過__init__方法接受參數。

"This would create first object of Employee class"

emp1 = Employee("Zara", 2000)

"Thir. Employee("Manni", 5000)

   

存取屬性

您可以使用點(.)來存取物件的屬性。使用以下類別的名稱來存取類別變數:

emp1.displayEmployee()

emp2.​​displayEmployee()

print "Total Employee%d"

完整實例:

#!/usr/bin/python

 

class Employee:

   

   def __init__(self, name, salary):

      self.name = name

      self.salary = salary

     displayCount(self):

     print "Total Employee %d" % Employee.empCount

 

   def dis中舉行", self.salary

 

"This would 。 playEmployee()

emp2.​​displayEmployee()

print "Total Employee %d" % Employee.empCount

   

: 執行上述ary:  2000

Name : Manni ,Salary:  5000

Total Employee 2

   

你可以加入,刪除,修改類別的屬性,如下圖

emp

你可以加入,刪除,修改類別的屬性,

emp1.age = 8  # 修改'age' 屬性

del emp1.age  # 刪除'age' 屬性

   

att

   

att

你也可以使用以下函數的方式來存取屬性。 , default]) : 存取物件的屬性。

hasattr(obj,name) : 檢查是否存在一個屬性。

setattr(obj,name,value) : 設定一個屬性。如果屬性不存在,會建立一個新屬性。

delattr(obj, name) : 刪除屬性。

hasattr(emp1, 'age')    # 如果存在 'age' 屬性回傳 True。

getattr(emp1, 'age')    # 傳回'age' 屬性的值

setattr(emp1, 'age', 8) # 新增屬性'刪除屬性'age'

   

Python內建類別屬性

__dict__ : 類別的屬性(包含一個字典,由類別的資料屬性所組成)

__doc 類

__module__: 類別定義所在的模組(類別的全名是'__main__.className',如果類別位於一個導入模組mymod中,那麼className.__module__ 等於mymod)

__bases__ : 類別的所有父類別構成元素(包含了以個由所有父類別組成的元組)

Python內建類別屬性呼叫實例如下:

#!/usr/bin/python

 

. employees'

   empCount = 0

 

   def __init__(self, name, .salary = salary

      Employee.empCount += 1

   

   def displayCount( 。  ", Salary: ", self.salary

 

print "Employee.__doc__:", Employee.__doc__

print "Employee.__name__:", Employee.__name__

print "Employee.__module__:", Employloyee.__Hconloyee. __bases__

print "Employee.__dict__:", Employee.__dict__

   

執行上述程式碼輸出s

Employee.__name__: Employee

Employee.__module__: __main__

Employee.__bases__: ()

Employee.__dict__: {'__module__': '__main____','displayCount' p. 2,

'displayEmployee': ,

'__doc__': 'Common base class for all employees',

__

'__init__':4function 

python物件銷毀(垃圾回收)

同Java語言一樣,Python使用了引用計數這項簡單技術來追蹤記憶體中的物件。

在Python內部記錄所有使用中的物件各有多少引用。

一個內部追蹤變量,稱為一個引用計數器。

當物件被建立時, 就建立了一個引用計數, 當這個物件不再需要時, 也就是說, 這個物件的參考計數變成0 時, 它被垃圾回收。但是回收不是"立即"的, 由解釋器在適當的時機,將垃圾物件佔用的記憶體空間回收。

a = 40      # 建立物件 

b = a    # 增加引用.  的計數

 

del a       # 減少引用 的數量

b = 100     # 減少引用 的數

c[0] = -1 

垃圾回收機制不僅針對引用計數為0的對象,同樣也可以處理循環引用的情況。循環引用指的是,兩個物件相互引用,但是沒有其他變數引用他們。這種情況下,僅使 用引用計數是不夠的。 Python 的垃圾收集器實際上是一個引用計數器和一個循環垃圾收集器。作為引用計數的補充, 垃圾收集器也會留心被分配的總量很大(及未通過引用計數銷毀的那些)的對象。 在這種情況下, 解釋器會暫停下來, 試圖清理所有未引用的循環。

實例

析構函數__del__ ,__del__在物件消逝的時候被調用,當物件不再被使用時,__del__方法運作:

#!/usr/bin/python

class Point:

   def __init( self, x=0, y=0):

      self.x  def __del__(self):

      class_name = self.__class__ .__name__

      print class_name, "destroyed"

 

pt1 = Point()

pt2 =ptpt111115% id(pt2), id(pt3) # 印刷物件的id

del pt1

del pt2

del pt3

<p></p><p>以上實例運作結果如下:</p><p></p><pre class="brush:php;toolbar:false"><p>以上實例運作結果如下:</p><p></p><pre class="brush:php;toolbar:false"><p></p><p>以上實例運作結果如下:</p><p></p><pre class="brush:php;toolbar:false"><p>以上實例運作結果324</p><p></p>Point destroyed<p></p>   <p> </p><p></p>注意:通常你需要在單獨的文件中定義一個類,<p></p>類的繼承<p></p>面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制。繼承完全可以理解成類別之間的類型和子類型關係。 <p></p>需要注意的地方:繼承語法 class 衍生類別名(基底類別名稱)://... 基底類別名稱寫作括號裡,基本類別是在類別定義的時候,在元組之中指明的。 <p></p>在python中繼承中的一些特點:<p></p>1:在繼承中基類的構造(__init__()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。 <p></p>2:在呼叫基底類別的方法時,需要加上基底類別的類別名稱前綴,且需要帶上self參數變數。區別於在類別中呼叫普通函數時並不需要帶上self參數<p></p>3:Python總是先尋找對應類型的方法,如果它不能在衍生類別中找到對應的方法,它才開始到基底類別中逐個查找。 (先在本類別中找出呼叫的方法,找不到才去基底類別找)。 <p></p>如果在繼承元組中列了一個以上的類,那麼它就被稱作"多重繼承" 。 <p></p>語法:<p></p>衍生類別的聲明,與他們的父類別類似,繼承的基底類別清單跟在類別名稱之後,如下所示:<p></p><p></p><p></p>class SubClassName (ParentClass1[, ParentClass2, ... ]):<p></p>   'Optional class documentation string'<p></p>   class_suite<p></p>   <p></p><p></p>/ <p> </p><p>class Parent:        # define parent class</p><p>   parentAttr = 100</p><p>   def __init__(self):</p><p>      print "Calling parent constructor"</p> 'Calling parent method'<p></p> <p></p>   def setAttr(self, attr):<p></p> Parent.parentAttr = attr<p></p> <p></p>   def getAttr(self):<p></p>      print <p>class Child(Parent): # define child class</p><p>   def __init__(self):</p><p>      print </p>      print 'Calling child method'<p></p> <p></p>c = Child()          # 實例化子類別<p></p>c.childMethod()      # 將子類別呼叫的方法<p>   # 再次呼叫父類別的方法</p> <p>c.getAttr()      Sharp </p><p>Calling parent method</p><p>Parent attribute : 200 </p><p>   </p><p></p><p>你可以繼承多個類別</p><p></p><p></p><p>class A:              # define your calss B</p><p>... ..</p><p> </p><p>class C(A, B):   # subclass of A and B</p><p>.....</p><p>   </p><p></p><p></p>   <p></p><p></p>你可以使用is <p></p>issubclass() - 布林函數判斷一個類別是另一個類別的子類別或子孫類,語法:issubclass(sub,sup)<p></p>isinstance(obj, Class) 布林函數如果obj是Class類別的實例物件或是一個Class子類別的實例物件則回傳true。 <p></p>重載方法<p></p>如果你的父類方法的功能不能滿足你的需求,你可以在子類重載你父類的方法:<p></p>實例:<p></p><p></p><p></p>實例:<p></p><p></p><p> /python</p><p> </p><p>class Parent:        # 定義父類別</p><p>   def myMethod(self): </p>class Child(Parent): # 定義子類別<p></p>   def myMethod(self) :<p></p>      print 'Calling child method'<p></p> <p></p>c = Child()       呼叫重載方法<p></p>   <p></p><p></p>執行上述程式碼輸出結果如下:<p> </p><p></p><p></p>Calling child method<p></p>   <p></p><p></p>基礎重載方法<p></p>下表列出了一些通用的功能,你可以在自己的類重寫:簡單的呼叫<p></p><p></p>1    __init__ ( self [,args...] )<p>建構子</p>簡單的呼叫方法: obj = className(args)    <p></p>2 析  del__簡單的呼叫方法: dell obj    <p></p>3    __repr__( self )<p>轉化為解釋器讀取的形式</p>簡單的呼叫方法: repr(obj)  人閱讀的形式<p>簡單的呼叫方法: str(obj)    </p><p>5    __cmp__ ( self, x )</p>物件比較<p>簡單的呼叫方法: cmp(obj, x)     運算子重載運算實例如下:</p><p></p><p></p><p>#!/usr/bin/python</p><p> </p><p>class Vector:</p><p>  </p><p>      self.b = b </p><p> </p><p>   def __str__(self):<br><br>      return 'Vector (%d, __(self,other):</p><p>      return Vector( self.a + other.a, self.b + other.b)<br><br> </p><p>v1 = Vector(2,10)<br><br>v2 = Vector(5,-2)🠎 </p><p> <br>以上程式碼執行結果如下圖:<br></p><p><br><br></p>Vector(7,8)<p></p>   <p></p><p></p>隱藏資料<p>   </p><p></p><p>隱藏資料</p><p>在把類別變數名稱或成員函數前面加兩個底線即可實現資料隱藏的功能,這樣,對於類別的實例來說,其變數名稱和成員函數是不能使用的,對於其類別的繼承類別來說,也是隱藏的,這樣,其繼承類別可以定義其一模一樣的變數名或成員函數名,而不會造成命名衝突。 例:</p><p></p><p></p><p>#!/usr/bin/python</p><p> </p><p>class JustCounter:</p><p>   __secretCount = 0</p> .__secretCount += 1<p></p>      print self.__secretCount<p></p> <p></p>counter = JustCounter()<p></p>counter.count()<p></p>counter.count()<p></p>print counter.__secretCount<p></p>   <p></p><p> </p><p>2</p> <p>Traceback (most recent call last):</p><p>  File "test.py", line 12, in <module></module></p><p>    print counter.__secsCount </p><p>   </p><p></p><p>Python不允許實例化的類別存取隱藏數據,但你可以使用object._className__attrName存取屬性,將如下程式碼替換以上程式碼的最後一行程式碼:</p><p></p><p></p><p>............. ..........</p><p>print counter._JustCounter__secretCount</p><p>   </p><p></p><p>執行上述程式碼,執行結果如下:</p><p></p><p>1</p>
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. C:了解關鍵差異Python vs. C:了解關鍵差異Apr 21, 2025 am 12:18 AM

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

Python vs.C:您的項目選擇哪種語言?Python vs.C:您的項目選擇哪種語言?Apr 21, 2025 am 12:17 AM

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

達到python目標:每天2小時的力量達到python目標:每天2小時的力量Apr 20, 2025 am 12:21 AM

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

最大化2小時:有效的Python學習策略最大化2小時:有效的Python學習策略Apr 20, 2025 am 12:20 AM

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

在Python和C之間進行選擇:適合您的語言在Python和C之間進行選擇:適合您的語言Apr 20, 2025 am 12:20 AM

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python與C:編程語言的比較分析Python與C:編程語言的比較分析Apr 20, 2025 am 12:14 AM

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天2小時:Python學習的潛力每天2小時:Python學習的潛力Apr 20, 2025 am 12:14 AM

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python與C:學習曲線和易用性Python與C:學習曲線和易用性Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),