内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Python對象是什么

這篇文章主要講解了“Python對象是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python對象是什么”吧!

創(chuàng)新互聯(lián)建站主打移動網站、成都網站設計、成都網站制作、網站改版、網絡推廣、網站維護、域名注冊、等互聯(lián)網信息服務,為各行業(yè)提供服務。在技術實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務,根據(jù)網站的內容與功能再決定采用什么樣的設計。最后,要實現(xiàn)符合網站需求的內容、功能與設計,我們還會規(guī)劃穩(wěn)定安全的技術方案做保障。

類和對象的概念

類是對我們要處理的客觀事物的抽象。類用來描述具有相同的屬性和方法的對象的集合,它定義了該集合中每個對象所共有的屬性和方法。對象是類在內存的實例,一個類可以實例化為多個對象。類是抽象的,不占用內存,而對象是具體的,占用存儲空間。

類的成員

作為Python初學者,大可不必把精力花費在令人費解的概念上,只需要掌握使用類的基本要素就可以了。未來的日子里,你有足夠多的時間慢慢體會OOP的博大精深。隨著經驗的積累,OOP會自然而然地成為你的思維工具。

下面的代碼,定義了一個名為A的類。所有的類,都有構造函數(shù)和析構函數(shù),此外,還可以包含成員函數(shù)和成員變量。我喜歡把成員函數(shù)叫做類的方法,把成員變量叫做類的屬性。

當類被實例化為對象時,首先執(zhí)行構造函數(shù),當對象被銷毀時,會自動執(zhí)行析構函數(shù)。一般的,我們會在構造函數(shù)中進行初始化工作,在析構函數(shù)中進行清理工作。

讀到這里,有很多初學者一定會說:我定義類的時候,寫過構造函數(shù),但從沒有寫過析構函數(shù),你為什么說所有的類都有構造函數(shù)和析構函數(shù)呢?沒錯,定義類的時候,即便我們不寫構造函數(shù)和析構函數(shù),這兩個方法也照樣存在(析構函數(shù)稍微有點特殊,我們不能直接看到它——除非是我們自己定義的)。如果我們自己定義了構造函數(shù)和析構函數(shù),則將會取代系統(tǒng)自動賦予的這兩個函數(shù)。下面的例子清晰地說明了其中的奧秘:類A既沒有構造函數(shù),也沒有析構函數(shù),類B只有析構函數(shù),兩個類都可以生成類實例,也都可以銷毀,且 del b 時首先調用了自定義的析構函數(shù)。

新式類和舊式類

在PY2中,類有新式類和舊式類兩種。新式類需要繼承自虛類Object,舊式類則不需要。PY2中類的寫法有三種:

在PY3中,只有新式類,不再支持舊式類。你如果習慣繼承Object的寫法,也完全沒有問題。上面三種寫法在PY3中都被解釋成新式類。新式類和舊式類的主要區(qū)別是:

  • 新式類可以繼承Object的構造函數(shù)和析構函數(shù),如果類的構造和析構函數(shù)沒有特別的工作,可以省略。而舊式類則不能:

此時用PY2運行,會出現(xiàn)錯誤:AttributeError: class A has no attribute '__init__',使用PY3不會出現(xiàn)此錯誤。若改成新式類寫法:

仍然用PY2運行,則都不會出錯。

  • 新式類可以使用super:

  • 多重繼承時,各父類的初始化和函數(shù)查找順序不同:舊式類為深度優(yōu)先繼承,新式類為廣度優(yōu)先繼承。

靜態(tài)變量和實例變量

在構造函數(shù)中定義的變量,我們稱之為實例變量。實例變量只能在實例化后使用<對象名.變量名>的方式訪問。靜態(tài)變量一般定義在類的開始位置,獨立于構造函數(shù)之外。靜態(tài)變量既可以<對象名.變量名>的方式訪問,也可以<類名.變量名>的方式訪問。通常,類的靜態(tài)變量一般用于保存類的靜態(tài)屬性,該屬性可被類的方法使用,但不應該被類的方法修改。

靜態(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)變量。

面向對象三要素

面向對象,有三大要素:繼承、封裝、多態(tài)。這里面概念非常多,往往越講越糊涂。為了不至于誤導讀者,我盡可能不做解釋,只給出例子,請自行揣摩。

(1) 繼承

如果派生類只有一個父類,就是單繼承。這是最常見的類定義形式。

如果派生類有多個父類,就是多繼承。

不管是單繼承還是多繼承,都可以在派生類中重寫父類的函數(shù)——這叫做覆蓋。

(2) 封裝

所謂封裝,就是將類的成員變量、成員函數(shù)整合在一起,并對關鍵的信息進行保護或隱藏。信息保護或隱藏有三個級別:公有、保護、私有。如果你有C++的使用經驗,我們先來回顧一下C++的信息隱藏規(guī)則:

  1. 公有成員:對類外部的任何代碼可見;

  2. 保護成員:對類外部的任何代碼都不可見,但對派生類可見;

  3. 私有成員:對類外部及派生類都不可見。

對應這三個級別,Python 是這樣定義的:

  1. 以英文字母開頭的成員為公有成員

  2. 以一個下劃線開頭的成員為保護成員

  3. 以兩個下劃線開關的成員為私有成員

下面我們試試 Python 的信息保護或隱藏規(guī)則是否有效。

試試訪問公有成員:

公有成員訪問規(guī)則與C++相同。先跳過保護成員,看看私有成員:

私有成員的訪問規(guī)則也與C++相同。那我為什么跳過保護成員了?來試試吧:

看到這里就已經不對了,應該只有類內部的代碼和派生類能使用啊,怎么可以直接用了呢?是的,Python的保護成員訪問規(guī)則與C++的確實不一樣。那 Python 的保護成員是什么樣的機制呢?原來,在 Python 的OOP中,保護成員公有成員沒有任何區(qū)別。保護規(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

此時,保護成員_B被保護了。但這種情況僅適用于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)

當父類有多個派生類,且派生類都實現(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ù)。抽象類應用場景是什么呢?我曾經做過很多下載數(shù)據(jù)的腳本插件,不同的數(shù)據(jù)源使用不同的腳本,所有這些腳本要求必須有名字相同的方法,此時,抽象類就派上用場了。

單例模式

單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統(tǒng)中,某個類只能出現(xiàn)一個實例時(如軟件配置類,無論在軟件的什么地方實例化,永遠都是那一個對象),單例模式就能派上用場。比如,Python 日志模塊中的日志對象,或者異步通訊框架Twisted 里面的反應堆(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對象是什么”的內容了,經過本文的學習后,相信大家對Python對象是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

本文名稱:Python對象是什么
網址分享:http://www.rwnh.cn/article10/ihjcgo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供App設計、網站改版、商城網站、建站公司、域名注冊動態(tài)網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站優(yōu)化排名
山阳县| 常熟市| 出国| 托克托县| 南召县| 澄城县| 常德市| 霍林郭勒市| 鄱阳县| 千阳县| 资讯| 海南省| 房产| 吉首市| 延吉市| 资讯| 潼南县| 东台市| 巴青县| 南平市| 汝州市| 屯留县| 华安县| 岳西县| 乌兰县| 鸡东县| 贵州省| 唐河县| 樟树市| 弋阳县| 赫章县| 娱乐| 德令哈市| 丹凤县| 木里| 拉萨市| 绥棱县| 治多县| 和静县| 武宁县| 孝感市|