這篇文章主要講解了“Python對象是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python對象是什么”吧!
創(chuàng)新互聯(lián)建站主打移動網(wǎng)站、成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、域名注冊、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再決定采用什么樣的設(shè)計。最后,要實現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計,我們還會規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
類和對象的概念
類是對我們要處理的客觀事物的抽象。類用來描述具有相同的屬性和方法的對象的集合,它定義了該集合中每個對象所共有的屬性和方法。對象是類在內(nèi)存的實例,一個類可以實例化為多個對象。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。
類的成員
作為Python初學(xué)者,大可不必把精力花費在令人費解的概念上,只需要掌握使用類的基本要素就可以了。未來的日子里,你有足夠多的時間慢慢體會OOP的博大精深。隨著經(jīng)驗的積累,OOP會自然而然地成為你的思維工具。
下面的代碼,定義了一個名為A的類。所有的類,都有構(gòu)造函數(shù)和析構(gòu)函數(shù),此外,還可以包含成員函數(shù)和成員變量。我喜歡把成員函數(shù)叫做類的方法,把成員變量叫做類的屬性。
當(dāng)類被實例化為對象時,首先執(zhí)行構(gòu)造函數(shù),當(dāng)對象被銷毀時,會自動執(zhí)行析構(gòu)函數(shù)。一般的,我們會在構(gòu)造函數(shù)中進(jìn)行初始化工作,在析構(gòu)函數(shù)中進(jìn)行清理工作。
讀到這里,有很多初學(xué)者一定會說:我定義類的時候,寫過構(gòu)造函數(shù),但從沒有寫過析構(gòu)函數(shù),你為什么說所有的類都有構(gòu)造函數(shù)和析構(gòu)函數(shù)呢?沒錯,定義類的時候,即便我們不寫構(gòu)造函數(shù)和析構(gòu)函數(shù),這兩個方法也照樣存在(析構(gòu)函數(shù)稍微有點特殊,我們不能直接看到它——除非是我們自己定義的)。如果我們自己定義了構(gòu)造函數(shù)和析構(gòu)函數(shù),則將會取代系統(tǒng)自動賦予的這兩個函數(shù)。下面的例子清晰地說明了其中的奧秘:類A既沒有構(gòu)造函數(shù),也沒有析構(gòu)函數(shù),類B只有析構(gòu)函數(shù),兩個類都可以生成類實例,也都可以銷毀,且 del b 時首先調(diào)用了自定義的析構(gòu)函數(shù)。
新式類和舊式類
在PY2中,類有新式類和舊式類兩種。新式類需要繼承自虛類Object,舊式類則不需要。PY2中類的寫法有三種:
在PY3中,只有新式類,不再支持舊式類。你如果習(xí)慣繼承Object的寫法,也完全沒有問題。上面三種寫法在PY3中都被解釋成新式類。新式類和舊式類的主要區(qū)別是:
新式類可以繼承Object的構(gòu)造函數(shù)和析構(gòu)函數(shù),如果類的構(gòu)造和析構(gòu)函數(shù)沒有特別的工作,可以省略。而舊式類則不能:
此時用PY2運行,會出現(xiàn)錯誤:AttributeError: class A has no attribute '__init__',使用PY3不會出現(xiàn)此錯誤。若改成新式類寫法:
仍然用PY2運行,則都不會出錯。
新式類可以使用super:
多重繼承時,各父類的初始化和函數(shù)查找順序不同:舊式類為深度優(yōu)先繼承,新式類為廣度優(yōu)先繼承。
靜態(tài)變量和實例變量
在構(gòu)造函數(shù)中定義的變量,我們稱之為實例變量。實例變量只能在實例化后使用<對象名.變量名>的方式訪問。靜態(tài)變量一般定義在類的開始位置,獨立于構(gòu)造函數(shù)之外。靜態(tài)變量既可以<對象名.變量名>的方式訪問,也可以<類名.變量名>的方式訪問。通常,類的靜態(tài)變量一般用于保存類的靜態(tài)屬性,該屬性可被類的方法使用,但不應(yīng)該被類的方法修改。
靜態(tài)函數(shù)
與其他語音的靜態(tài)函數(shù)不同,Python的靜態(tài)函數(shù)有兩種,都是用裝飾器實現(xiàn)的:
Staticmethod 函數(shù)不能使用Self參數(shù),因此不成訪問任何成員變量,只能通過類名訪問類的靜態(tài)變量。
Classmethod 函數(shù)也不能使用Self參數(shù),因此不成訪問任何成員變量,但它有cls參數(shù)。cls參數(shù)不是對象的引用,而是類的引用,可以通過cls參數(shù)訪問類的靜態(tài)變量。
面向?qū)ο笕?/p>
面向?qū)ο螅腥笠兀豪^承、封裝、多態(tài)。這里面概念非常多,往往越講越糊涂。為了不至于誤導(dǎo)讀者,我盡可能不做解釋,只給出例子,請自行揣摩。
(1) 繼承
如果派生類只有一個父類,就是單繼承。這是最常見的類定義形式。
如果派生類有多個父類,就是多繼承。
不管是單繼承還是多繼承,都可以在派生類中重寫父類的函數(shù)——這叫做覆蓋。
(2) 封裝
所謂封裝,就是將類的成員變量、成員函數(shù)整合在一起,并對關(guān)鍵的信息進(jìn)行保護(hù)或隱藏。信息保護(hù)或隱藏有三個級別:公有、保護(hù)、私有。如果你有C++的使用經(jīng)驗,我們先來回顧一下C++的信息隱藏規(guī)則:
公有成員:對類外部的任何代碼可見;
保護(hù)成員:對類外部的任何代碼都不可見,但對派生類可見;
私有成員:對類外部及派生類都不可見。
對應(yīng)這三個級別,Python 是這樣定義的:
以英文字母開頭的成員為公有成員
以一個下劃線開頭的成員為保護(hù)成員
以兩個下劃線開關(guān)的成員為私有成員
下面我們試試 Python 的信息保護(hù)或隱藏規(guī)則是否有效。
試試訪問公有成員:
公有成員訪問規(guī)則與C++相同。先跳過保護(hù)成員,看看私有成員:
私有成員的訪問規(guī)則也與C++相同。那我為什么跳過保護(hù)成員了?來試試吧:
看到這里就已經(jīng)不對了,應(yīng)該只有類內(nèi)部的代碼和派生類能使用啊,怎么可以直接用了呢?是的,Python的保護(hù)成員訪問規(guī)則與C++的確實不一樣。那 Python 的保護(hù)成員是什么樣的機制呢?原來,在 Python 的OOP中,保護(hù)成員公有成員沒有任何區(qū)別。保護(hù)規(guī)則僅適用于 from xxx import * 這一種情況。
testA.py
class A(object): pass class _B(object): pass
testB.py
from testA import * a = A() b = _B()
執(zhí)行testB.py時:
Traceback (most recent call last): File "testB.py", line 4, inb = _B()NameError: name '_B' is not defined
此時,保護(hù)成員_B被保護(hù)了。但這種情況僅適用于from xxx import *這一種情況。如果testB.py這樣寫:
testB.py
from testA import A, _B a = A() b = _B()
或者:
import testA a = testA.A() b = testA._B()
則是沒有任何問題的。
(3) 多態(tài)
當(dāng)父類有多個派生類,且派生類都實現(xiàn)了同一個成員函數(shù),則可以實現(xiàn)多態(tài):
class H2O(object): def what(self): print("I am H2O") class Water(H2O): def what(self): print("I am water") class Ice(H2O): def what(self): print("I am ice") class WaterVapor(H2O): def what(self): print("I am water vapor"); def what(obj): obj.what() objs = [H2O(), Water(), Ice(), WaterVapor()] for obj in objs: what(obj)
抽象類
抽象類不能被實例化,只能作為父類被其它類繼承,且派生類必須實現(xiàn)抽象類中所有的成員函數(shù)。抽象類應(yīng)用場景是什么呢?我曾經(jīng)做過很多下載數(shù)據(jù)的腳本插件,不同的數(shù)據(jù)源使用不同的腳本,所有這些腳本要求必須有名字相同的方法,此時,抽象類就派上用場了。
單例模式
單例模式(Singleton Pattern)是一種常用的軟件設(shè)計模式,該模式的主要目的是確保某一個類只有一個實例存在。當(dāng)你希望在整個系統(tǒng)中,某個類只能出現(xiàn)一個實例時(如軟件配置類,無論在軟件的什么地方實例化,永遠(yuǎn)都是那一個對象),單例模式就能派上用場。比如,Python 日志模塊中的日志對象,或者異步通訊框架Twisted 里面的反應(yīng)堆(reactor),都是典型的單例模式——盡管它們不一定是下面這種方法實現(xiàn)的。
Python可以使用裝飾器的方法使用單例模式:
>>> import abc>>> class A(object, metaclass=abc.ABCMeta): @abc.abstractmethod def a(self): pass @abc.abstractmethod def b(self): pass>>> class C(A): def a(self): print("a")>>> c = C()Traceback (most recent call last): File "", line 1, inc = C()TypeError: Can't instantiate abstract class C with abstract methods b
感謝各位的閱讀,以上就是“Python對象是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python對象是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!