




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Python-面向?qū)ο驪ython 面向?qū)ο驪ython 從設計之初就已經(jīng)是一門面向?qū)ο蟮?語言,正因為如此,在 Python 中創(chuàng)建一個類 和對象是很容易的。本章節(jié)我們將詳細介紹 Python 的面向?qū)ο缶幊獭?如果你以前沒有接觸過面向?qū)ο蟮木幊陶Z言, 那你可能需要先了解一些面向?qū)ο笳Z言的一 些基本特征, 在頭腦里頭形成一個基本的面向 對象的概念,這樣有助于你更容易的學習 Python 的面向?qū)ο缶幊獭?接下來我們先來簡單的了解下面向?qū)ο蟮囊?些基本特征。面向?qū)ο蠹夹g簡介類(Class): 用來描述具有相同的屬性和方法 的對象的集合。 它定義了該集合中每個對象所共 有的屬性和方法。對象是類的
2、實例。類變量:類變量在整個實例化的對象中是公 用的。類變量定義在類中且在函數(shù)體之外。 類變 量通常不作為實例變量使用。數(shù)據(jù)成員:類變量或者實例變量用于處理類 及其實例對象的相關的數(shù)據(jù)。方法重寫:如果從父類繼承的方法不能滿足 子類的需求, 可以對其進行改寫, 這個過程叫方 法的覆蓋( override ),也稱為方法的重寫。實例變量:定義在方法中的變量,只作用于 當前實例的類。繼承:即一個派生類( derived class )繼承 基類( base class )的字段和方法。 繼承也允許 把一個派生類的對象作為一個基類對象對待。 例 如,有這樣一個設計:一個 Dog 類型的對象派 生自 An
3、imal 類,這是模擬 是一個( is-a )關 系(例圖, Dog 是一個 Animal )。實例化:創(chuàng)建一個類的實例,類的具體對象。 方法:類中定義的函數(shù)。對象:通過類定義的數(shù)據(jù)結構實例。對象包 括兩個數(shù)據(jù)成員(類變量和實例變量)和方法。創(chuàng)建類使用 class 語句來創(chuàng)建一個新類, class 之后為 類的名稱并以冒號結尾,如下實例 :class ClassName 類的幫助信息 # 類文檔字符串 class_suite# 類體類的幫助信息可以通過 ClassName._doc_ 查 看。class_suite 由類成員,方法,數(shù)據(jù)屬性組成。實例以下是一個簡單的 Python 類實例 :#
4、!/usr/bin/python# -*- coding: UTF-8 -*-class Employee : 所有員工的基類 empCount = 0def _init_ ( self , name , salary ):self . name = nameself . salary = salaryEmployee . empCount += 1def displayCount( self ):print nTotal Employee %dn % EmployeeempCountdef displayEmployee (self):print Name : , self .namd ,
5、Sa lary: n , self .salaryempCount變量是一個類變量,它的值將在這個類的所有實例之間共享。你可以在內(nèi)部類或外部類使用Employee.empCount訪問。第一種方_init_ ()方法是一種特殊的方 法,被稱為類的構造函數(shù)或初始化方法,當創(chuàng)建 了這個類的實例時就會調(diào)用該方法self代表類的實例,self在定義類的方法時是必須有的,雖然在調(diào)用時不必傳入相應的參數(shù)。self代表類的實例,而非類類的方法與普通的函數(shù)只有一個特別的區(qū)別 它們必須有一個額外的第一個參數(shù)名稱,按照慣 例它的名稱是selfoclass Test:def prt(self):print(self
6、)print (self class)t = Test ()t.prt()以上實例執(zhí)行結果為: mainTest instance at 0xl0d066878main Test從執(zhí)行結果可以很明顯的看出,self代表的是類 的實例,代表當前對象的地址,而self.class則 指向類。self不是python關鍵字,我們把他換成 runoob也是可以正常執(zhí)行的:class Test:def prt(runoob):print(runoob)print (runoobclass)t = Test ()t . prt ()以上實例執(zhí)行結果為:_main_.Test創(chuàng)建實例對象要創(chuàng)建一個類的實例,
7、你可以使用類的名稱,并通過 _init_ 方法接受參數(shù)。 創(chuàng)建 Employee 類的第一個對象 emp1 = Employee ( Zara , 2000 ) 創(chuàng)建 Employee 類的第二個對象 emp2 = Employee ( Manni , 5000 )訪問屬性您可以使用點 (.)來訪問對象的屬性。使用如下類 的名稱訪問類變量 :emp1. displayEmployee()emp2. displayEmployee()print Total Employee %d % Employee . em pCount完整實例:#!/usr/bin/python# -*- coding:
8、UTF-8 -*-class Employee : 所有員工的基類 empCount = 0def _init_ ( self , name , salary ): self . name = nameself . salary = salary Employee . empCount += 1def displayCount ( self ): print Total Employee %d % Employe e. empCountdef displayEmployee ( self ):print Name : , self . name, , lary: , self . salary
9、 創(chuàng)建 Employee 類的第一個對象 emp1 = Employee ( Zara , 2000 ) 創(chuàng)建 Employee 類的第二個對象 emp2 = Employee ( Manni , 5000 ) emp1. displayEmployee () emp2. displayEmployee () print Total Employee %d % Employee pCount執(zhí)行以上代碼輸出結果如下:Name : Zara , Salary : 2000 Name : Manni , Salary : 5000Total Employee 2你可以添加,刪除,修改類的屬性,如下
10、所示:Sa. ememp1. age = 7 # 添加一個 age 屬性 emp1. age = 8 # 修改 age 屬性del emp1 . age # 刪除 age 屬性你也可以使用以下函數(shù)的方式來訪問屬性: getattr(obj, name, default) : 訪問對象的 屬性。hasattr(obj,name) : 檢查是否存在一個屬 性。setattr(obj,name,value) :設置一個屬性。如果屬性不存在,會創(chuàng)建一個新屬性。delattr(obj, name) : 刪除屬性。hasattr( emp1,age) # 如果存在 age屬性返回True 。getattr
11、( emp1,age) # 返回 age屬的值setattr( emp1,age, 8) # 添加屬性age值為 8delattr( empl ,age) # 刪除屬性agePython 內(nèi)置類屬性dict_ : 類的屬性(包含一個字典,由類的數(shù)據(jù)屬性組成)_doc_ : 類的文檔字符串_name_: 類名_module_: 類定義所在的模塊 (類的全名 是 _main_.className ,如果類位于一個導 入模塊 mymod 中,那么 className._module_等于 mymod )_bases_ : 類的所有父類構成元素(包含 了一個由所有父類組成的元組)Python 內(nèi)置類屬
12、性調(diào)用實例如下:#!/usr/bin/python# -*- coding: UTF-8 -*-class Employee : 所有員工的基類 empCount = 0def _init_ ( self , name , salary ): self . name = nameself . salary = salaryEmployee . empCount +=1defdisplayCount ( self ):print Total Employee %d% Employee. empCountdefdisplayEmployee ( self):printName : , self.
13、name, , Salary: , self . salaryprintEmployee._doc_:,Employee . _doc_printEmployee._name_:, Employee . _nameprintEmployee._module_:, Employee. _module_printEmployee._bases_:, Employee ._bases_printEmployee._dict_:, Employee . _dict執(zhí)行以上代碼輸出結果如下:Employee . _doc_ : 所有員工的基類Employee . _name_ :EmployeeEmpl
14、oyee . _module: _main_Employee . _bases: ()Employee . _dict_ : _module_ : _main_ , displayCount: , empCount :0, displayEmployee: , _doc_ : xe6x89x80xe6x9cx89xe5x91x98xe5xb7xa5xe7x9ax84xe5x9fxbaxe7xb1xbb ,_init_: python 對象銷毀 (垃圾回收 )Python 使用了引用計數(shù)這一簡單技術來跟蹤和 回收垃圾。在 Python 內(nèi)部記錄著所有使用中的對象各有多少 引用。一個內(nèi)部跟蹤變量,
15、稱為一個引用計數(shù)器。當對象被創(chuàng)建時, 就創(chuàng)建了一個引用計數(shù), 當 這個對象不再需要時, 也就是說, 這個對象的 引用計數(shù)變?yōu)?0 時, 它被垃圾回收。但是回收 不是 立即 的, 由解釋器在適當?shù)臅r機,將垃圾 對象占用的內(nèi)存空間回收。a =40# 創(chuàng)建對象b =a#增加引用,的計數(shù)c = b#增加引用. 的計數(shù)dela#減少引用的計數(shù)b =100#減少引用的計數(shù)c 0= - 1#減少引用的計數(shù)垃圾回收機制不僅針對引用計數(shù)為 0 的對象,同 樣也可以處理循環(huán)引用的情況。 循環(huán)引用指的是, 兩個對象相互引用, 但是沒有其他變量引用他們。這種情況下,僅使用引用計數(shù)是不夠的。 Python 的垃圾收集器
16、實際上是一個引用計數(shù)器和一個循 環(huán)垃圾收集器。 作為引用計數(shù)的補充, 垃圾收集 器也會留心被分配的總量很大(及未通過引用計 數(shù)銷毀的那些)的對象。 在這種情況下, 解釋 器會暫停下來, 試圖清理所有未引用的循環(huán)。實例析構函數(shù) _del_ ,_del_ 在對象銷毀的時候 被調(diào)用,當對象不再被使用時, _del_ 方法運行:#!/usr/bin/python# -*- coding: UTF-8 -*-class Point :def _init_ ( self , x =0, y =0):self . x = xself . y = ydef _del_ ( self ):class_name
17、= self . _class_ . _nam e_print class_name , 銷毀 pt1 = Point ()pt2 = pt1pt3 = pt1print id ( pt1 ), id ( pt2 ), id ( pt3 ) # 打印對 象的 iddel pt1del pt2del pt3以上實例運行結果如下:3083401324 3083401324 3083401324Point 銷毀 注意:通常你需要在單獨的文件中定義一個類, 類的繼承 面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重 用,實現(xiàn)這種重用的方法之一是通過繼承機制。 繼承完全可以理解成類之間的類型和子類型關 系。需
18、要注意的地方:繼承語法 class 派生類名(基 類名): /. 基類名寫在括號里,基本類是在類 定義的時候,在元組之中指明的。在 python 中繼承中的一些特點:1:在繼承中基類的構造( _init_() 方法) 不會被自動調(diào)用, 它需要在其派生類的構造中親 自專門調(diào)用。2:在調(diào)用基類的方法時,需要加上基類的類 名前綴,且需要帶上 self 參數(shù)變量。區(qū)別于在 類中調(diào)用普通函數(shù)時并不需要帶上 self 參數(shù)3: Python 總是首先查找對應類型的方法, 如果它不能在派生類中找到對應的方法, 它才開 始到基類中逐個查找。 (先在本類中查找調(diào)用的 方法,找不到才去基類中找)。如果在繼承元組中
19、列了一個以上的類,那么它就 被稱作 多重繼承 。語法: 派生類的聲明,與他們的父類類似,繼承的基類 列表跟在類名之后,如下所示:class SubClassName ( ParentClass1 , Par entClass2 , .):Optional class documentation stringclass_suite實例:#!/usr/bin/python# -*- coding: UTF-8 -*-classParent# 定義父類parentAttr= 100def_init_ ( self):print 調(diào)用父類構造函數(shù) defparentMethod (self ):pri
20、nt 調(diào)用父類方法 defsetAttr( self ,attr ):Parent. parentAttr= attrdefgetAttr( self ):print 父類屬性: , Parent . parentAttrclassChild( Parent ):# 定義子類def_init_ ( self):print 調(diào)用子類構造方法 def childMethod ( self ):print 調(diào)用子類方法 child methodc = Child ()# 實例化子類c. childMethod ()# 調(diào)用子類的方法c. parentMethod ()# 調(diào)用父類方法c. setAt
21、tr ( 200)# 再次調(diào)用父類的方法c. getAttr ()# 再次調(diào)用父類的方法以上代碼執(zhí)行結果如下:調(diào)用子類構造方法調(diào)用子類方法 child method調(diào)用父類方法父類屬性 : 200你可以繼承多個類class A: # 定義類 Aclass B: # 定義類 Bclass C( A, B): # 繼承類 A 和 B你可以使用 issubclass() 或者 isinstance() 方法 來檢測。issubclass() - 布爾函數(shù)判斷一個類是另一 個類的子類或者子孫類,語法: issubclass(sub,sup)isinstance(obj, Class) 布爾函數(shù)如果 o
22、bj 是 Class 類的實例對象或者是一個 Class 子類 的實例對象則返回 true 。方法重寫如果你的父類方法的功能不能滿足你的需求,你 可以在子類重寫你父類的方法:實例:#!/usr/bin/python# -*- coding: UTF-8 -*- class Parent : # 定義父類def myMethod ( self ):print 調(diào)用父類方法 class Child ( Parent ): # 定義子類def myMethod ( self ):print 調(diào)用子類方法 c = Child () # 子類實例c. myMethod () # 子類調(diào)用重寫方法執(zhí)行以上
23、代碼輸出結果如下:調(diào)用子類方法基礎重載方法 下表列出了一些通用的功能,你可以在自己的類 重寫:序號方法 , 描述 & 簡單的調(diào)用1_init_ ( self ,args. )構造函數(shù) 簡單的調(diào)用方法 : obj = className(args)2_del_( self ) 析構方法 , 刪除一個對象 簡單的調(diào)用方法 : dell obj3_repr_( self ) 轉(zhuǎn)化為供解釋器讀取的形式 簡單的調(diào)用方法 : repr(obj)4_str_( self ) 用于將值轉(zhuǎn)化為適于人閱讀的形式 簡單的調(diào)用方法 : str(obj)5_cmp_ ( self, x ) 對象比較 簡單的調(diào)用方法 : cmp(obj, x)運算符重載Python 同樣支持運算符重載,實例如下:#!/usr/bin/pythonclass Vector :def _init_( self , a , b ):self . a self . b= a= bdef _str_( self ):returnVector (%d, %d)% ( self .a,self . b)def _add_ ( self , other ):returnVector ( self .
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房屋贈與與城市更新合同范本
- 二零二五年度標準畢業(yè)生實習合同(國際貿(mào)易)
- 2025年度旅游行業(yè)知識產(chǎn)權保護與免責責任協(xié)議
- 二零二五年度住宅小區(qū)戶外停車位租賃協(xié)議書樣本
- 二零二五年度順豐快遞員勞動合同職業(yè)培訓與發(fā)展基金合同
- 2025年度籃球運動員國際比賽參賽合同
- 二零二五年度資質(zhì)借用及知識產(chǎn)權保護協(xié)議
- 二零二五年度企業(yè)信息安全管理文員責任協(xié)議
- 二零二五年度主播商業(yè)代言授權合同
- 二零二五年度國際貿(mào)易資金監(jiān)管服務協(xié)議
- 科技成果查新檢索基本情況表
- 新媒體藝術設計交互融合元宇宙
- 家長會課件:七年級家長會優(yōu)質(zhì)課件
- 《AutoCAD 中文版實例教程(AutoCAD 2020) (微課版)(第 2 版)》課件 馬連志 第1、2章 AutoCAD 2020 中文版入門、繪圖設置
- 小學一年級硬筆書法入門班教學課件
- 社會工作-心理學視角下的校園欺凌認知與對策研究論文
- 面神經(jīng)炎臨床路徑
- 月光奏鳴曲全面版
- 2022年湖北省中小學教師高級職稱專業(yè)水平能力測試模擬題
- 數(shù)控車床操作培訓課件
- 工程經(jīng)濟學-邵穎紅-第五版-課后作業(yè)
評論
0/150
提交評論