您好,登錄后才能下訂單哦!
本篇內容主要講解“Python基礎知識之面向對象詳解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python基礎知識之面向對象詳解”吧!
Python設計之初是一門面向對象語言,面向對象其實就是一種編程的思想,現在人們比較認可的解釋就是:封裝、繼承、多態即為面向對象。
封裝、繼承、多態確實是一種面向對象的體現,感覺這種解釋比較牽強,面向對象的思想比較抽象,暫時沒有更好的解釋。
面向對象編程(Object Oriented Programming)簡稱OOP:(解釋非官方)將某一類具體的事物抽象出來其特征,行為,分析、設計和實現一個完整的程序。
面向對象思想的實現流程:
面向對象的分析(OOA, Object-Oriented Analysis)
面向對象的設計(OOD, Object-Oriented Design)
面向對象的程序設計(OOP, Object-Oriented Program)
面向對象測試(OOT,Object-Oriented Test)
面向對象維護(OOSM,Object-Oriendted Soft Maintenance)
程序員認為一切皆為對象,都可以代碼化。了解過程序常識的人都知道,程序員總是說沒有對象怎么辦?沒有對象new一個!!這其實是Java語言中實例化對象的一個梗,Python被人稱為最優美、最簡潔的語言,實例化對象以及類的定義確實比Java簡單一點。
今天咱要要說一說Python語言的類(Class),話不多說,舉個例子:現在我要統計我認識的人都用的什么手機,什么品牌,多大內存...等等,傻傻的就有人開始了,他的代碼是這樣的:
xxx_phone_name = 'iphone11'xxx_phone_screen_size = '6.1英寸'xxx_phone_color = '黑色'xxx_phone_ram = '3GB'xxx_phone_rom = '128GB'xxx_phone_camera = '1200萬'xxx_phone_battery = '3200mAh'xxx_phone_price = 5499xxx_phone_use = '打游戲'# ...
這統計一個都麻煩的要死,統計百八十個都累吐血了,所以咱們接下來認識一下類。
類:
一種復雜的自定義數據類型,參數可以是任何數據類型。
類的定義格式:
class <類名>(父類列表):類變量...初始化方法(self, 對象的變量...)類方法靜態方法屬性成員方法/對象方法析構方法
以上的具體內容后面會慢慢介紹,首先咱們先用面向對象的方法分析一下。目前我們的需求是統計某個人使用的手機品牌,屏幕大小,什么顏色,運行內存大小,存儲大小,像素,電池大小,價格,以及這個人主要用來做什么。所以我們規定手機這個對象必須有這些參數,用類的方法寫出來的程序就是這樣的:
class Phone: def __init__(self, name, screen_size, color, ram, rom, camera, battery, price, use): self.name = name self.screen_size = screen_size self.color = color self.ram = ram self.rom = rom self.camera = camera self.battery = battery self.price = price self.use = use def do(self): print('經常使用手機' + self.use)xxx_phone = Phone('iphone11', '6.1英寸', '黑色', '3GB', '128GB', '1200萬', '3200mAh', 5499, '打游戲')print('品牌:{},屏幕大小:{},顏色:{},運行內存:{},機身存儲:{},像素:{},電池容量:{},價格:{}'.format(xxx_phone.name, xxx_phone.screen_size, xxx_phone.color, xxx_phone.ram, xxx_phone.rom, xxx_phone.camera, xxx_phone.battery, xxx_phone.price))xxx_phone.do()
運行結果如下:
品牌:iphone11,屏幕大小:6.1英寸,顏色:黑色,運行內存:3GB,機身存儲:128GB,像素:1200萬,電池容量:3200mAh,價格:5499經常使用手機打游戲
雖然現在看起來代碼比之前多了,但是想想上萬條數據的話哪個更方便呢?
注意事項:
1、類名首字母大寫,為了與文件名(模塊名),函數名等區分,這是個規范(非規定)
2、一定要初始化函數
3、初始化函數的第一個參數self可以更改,不過不推薦更改,Python語言就是用的self,誰實例化self表示誰,用于區分同名的成員變量與對象變量。
程序的基本運行流程:
對象的構造過程:
1、為對象開辟空間,使用new構造方法2、調用初始化方法init初始化3、返回對象的引用。
class Phone: def __new__(cls,*args,**kwagrs): print('我先執行,開辟內存空間') # 返回并調用父類new構造方法,object為所有類的父類 return object.__new__(cls) def __init__(self,name): self.name = name print('實例化對象') # 析構函數,對象銷毀前執行,一般忽略 def __del__(self): print('對象被銷毀前執行我')phone1 = Phone('iphone 11')phone2 = Phone('iphone x')phone3 = Phone('iphone 8')phone4 = Phone('iphone 7')phone4 = Phone('iphone 11')print(phone1.name)print(phone2.name)print(phone3.name)print(phone4.name)
結果如下:
我先執行,開辟內存空間實例化對象我先執行,開辟內存空間實例化對象我先執行,開辟內存空間實例化對象我先執行,開辟內存空間實例化對象我先執行,開辟內存空間實例化對象對象被銷毀前執行我iphone 11iphone xiphone 8iphone 11對象被銷毀前執行我對象被銷毀前執行我對象被銷毀前執行我對象被銷毀前執行我
phone4變量先指向Phone('iphone 7')對象,后指向Phone('iphone 11'),因此Phone('iphone 7')對象先銷毀,可理解為后面的對象覆蓋的前面的對象,前面的對象沒用就銷毀了,程序結束前銷毀的所有對象。
垃圾回收機制:(簡單說一下)
程序中的對象有垃圾回收器(garbage collector)負責釋放,回收之前會自動調用對象對應類的析構方法,做釋放前的準備工作(關閉占用資源等)。
回收機制:
1、引用計數
2、標記清除
3、分代回收
系統為每個類自動提供一個默認的無參的初始化方法;
若自定義初始化方法,無參初始化方法不再提供。Java語言必須提供一個無參的構造方法,而Python則不需要,下面兩段代碼是一樣的。
class Test(): passt = Test()print(t)class Test1(): def __init__(self): passt1 = Test1()print(t1)
結果如下:
<__main__.Test object at 0x000002F57E31A208><__main__.Test1 object at 0x000002F57E31ADD8>
打印的為對象的內存地址,如果直接打印實例化對象,想按照自己的格式來打印,則需要重寫str方法,如:
class Phone: def __init__(self, name): self.name = name def __str__(self): return '手機為:'+self.namephone1 = Phone('蘋果')phone2 = Phone('華為')print(phone1)print(phone2)
結果如下:
手機為:蘋果手機為:華為
類和對象的關系:
1.類是對象的模板
2.一個類可以創建多個對象、
3.對象是類一個特定的個體
4.對象有獨立的內存空間,不會互相影響
== 與 is:
== 一般用于比較值
is 用于比較內存地址,查看內存地址id(x)
class Phone: def __init__(self, name): self.name = namephone1 = Phone('iphone 11')phone2 = Phone('iphone 11')print(phone1.name == phone2.name)print(phone1 == phone2)print(phone1 is phone2)
結果如下:
TrueFalseFalse
實例化的兩個對象雖然看起來一樣,但是卻不是同一個對象,就像兩個一樣的手機,在不同人的手機中,自己的手機丟了,不能以為兩個手機一樣,就說別人的手機就是自己的。
如果有特殊需要,如兩個不同的手機對象,只要名稱相同就認為相等,就需要重寫eq方法。
class Phone: def __init__(self, name): self.name = name def __eq__(self, other): return self.name == other.namephone1 = Phone('iphone 11')phone2 = Phone('iphone 11')print(phone1 == phone2)
結果為:
True
類屬性:
現在回到最開始的例子,統計自己的手機,它們都有一個共同的特征,就是這些手機的擁有者是我們自己。假如我們給每個實例化的手機加一個同樣的參數,就有些麻煩,因此介紹以下類屬性:所有實例化對象都擁有的屬性。
class Phone: owner = 'me' def __init__(self, name): self.name = namephone1 = Phone('華為')phone2 = Phone('榮耀')print(Phone.owner)print('這部'+phone1.name+'手機屬于:'+phone1.owner)print('這部'+phone2.name+'手機屬于:'+phone2.owner)
執行結果為:
me這部華為手機屬于:me這部榮耀手機屬于:me
類屬性,類可以直接調用,生成的所有的對象也能調用。
面向對象與面向過程:兩種不同的編程思想,面向過程就是按部就班的一步步,有順序、有步驟的執行。而面向對象是先弄明白需求,設計模板,大批量生產。就像有兩個人去收割麥子,面向過程是這樣的:
1、拿上鐮刀 2、收割麥子 3、運輸回家 4、收割麥子 5、運輸回家 6、...
面向過程的思想就是:需求是收割麥子,造一輛收割機,然后可以一直收割麥子。兩種思想有不同的使用場景,就像需要收割的麥子只有巴掌大小,和上千畝良田。
到此,相信大家對“Python基礎知識之面向對象詳解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。