欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python中面向?qū)ο蟮某S弥R(shí)點(diǎn)總結(jié)-創(chuàng)新互聯(lián)

這篇文章主要講解了“Python中面向?qū)ο蟮某S弥R(shí)點(diǎn)總結(jié)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python中面向?qū)ο蟮某S弥R(shí)點(diǎn)總結(jié)”吧!

為柳北等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及柳北網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、柳北網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

0x00 is與==

==運(yùn)算符是比較兩個(gè)對(duì)象的內(nèi)容是否相等,默認(rèn)情況是調(diào)用對(duì)象的__eq__方法進(jìn)行比較;而is是比較兩個(gè)對(duì)象是否一樣,它比較的兩個(gè)對(duì)象的id,即它們的內(nèi)存地址是否相同。

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a == b
True
# a和b是否是同一個(gè)對(duì)象
>>> a is b
False
# a和b的地址其實(shí)是不一樣的
>>> id(a)
4498717128
>>> id(b)
4446861832

在比較時(shí)但也有例外。Python對(duì)一些常用的值進(jìn)行緩存優(yōu)化,例如在區(qū)間[-5,256]的整數(shù),它們?cè)趧?chuàng)建時(shí),無(wú)論創(chuàng)建多少個(gè)對(duì)象,它們的id是一樣的,即它們?cè)诘讓又兄槐4嬉环輧?nèi)存。

>>> a = -5
>>> b = -5
>>> a == b
True
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a == b
True
>>> a is b
False

對(duì)一些短的字符串也是如此,因此并不是所有字符串都會(huì)創(chuàng)建新的實(shí)例

>>> a='123'
>>> b='123'
>>> a==b
True
>>> a is b
True
>>> id(a)
4446903800
>>> id(b)
4446903800
>>> x = 'long char'
>>> y = 'long char'
>>> x == y
True
>>> x is y
False

0x01 __repr__與__str__

每個(gè)類都應(yīng)該提供一個(gè)__repr__方法。__repr__方法和__str__方法有什么不一樣呢?
簡(jiǎn)單的說,__repr__可以反映一個(gè)對(duì)象的類型以及包含的內(nèi)容,而__str__主要是用于打印一個(gè)對(duì)象的內(nèi)容。例如看一下Python中的日期類datetime

import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2019, 7, 7)
>>> print(today)
2019-07-07
>>> str(today)
'2019-07-07'
>>> repr(today)
'datetime.date(2019, 7, 7)'

__str__在字符串連接,打印等操作會(huì)用到,而__repr__主要是面向開發(fā)者,它能反饋的信息比較多,例如在交互環(huán)境下輸入today這個(gè)變量會(huì)打印出datetime.date(2019, 7, 7),不僅可以看出today代表的是今天的日期信息,還可以看出它的類型信息。更重要的是你可以直接復(fù)制這段打印出來的信息,直接構(gòu)造一個(gè)“相同”的對(duì)象出來。

例如

>>> now = datetime.date(2019, 7, 7)
>>> now
datetime.date(2019, 7, 7)

0x02 對(duì)象復(fù)制

對(duì)象的復(fù)制或說對(duì)象拷貝可以分為淺拷貝和深拷貝。

淺拷貝與深拷貝

我們通過代碼來說明,就很好理解

如果要拷貝的對(duì)象是基本數(shù)據(jù)類型,那么深拷貝和淺拷貝的區(qū)別不是很大。

>>> a = [1,2,3]
>>> b = list(a)
>>> a[1]=200
>>> a
[1, 200, 3]
>>> b
[1, 2, 3]

修改a中的元素并不會(huì)影響到b

但如果要拷貝的對(duì)象包含了另一個(gè)對(duì)象,那么就要考慮深拷貝和淺拷貝的問題了。

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = list(a)
>>> a == b
True
>>> a is b
False

這里有一個(gè)列表a,里面有三個(gè)子列表,即列表里包含的是對(duì)象。

我們使用list工廠方法創(chuàng)建了一個(gè)a的拷貝b,這個(gè)b就是a的淺拷貝,為什么呢?

>>> a[1][2]='x'
>>> a
[[1, 2, 3], [4, 5, 'x'], [7, 8, 9]]
>>> b
[[1, 2, 3], [4, 5, 'x'], [7, 8, 9]]

把a(bǔ)[1][2]的元素修改成了x,這時(shí)候b列表中也響應(yīng)了相同的修改。所以這是淺拷貝,因?yàn)闆]有把子對(duì)象進(jìn)行拷貝,只是拷貝了指向子對(duì)象的引用。

知道淺拷貝,那么深拷貝就很好理解了。執(zhí)行拷貝之后,拷貝對(duì)象和原對(duì)象是完全獨(dú)立的,修改任何一個(gè)對(duì)象都不會(huì)影響到另一個(gè)對(duì)象

如何深拷貝一個(gè)對(duì)象

這時(shí)候就需要copy模塊了,該模塊有兩個(gè)重要的方法deepcopy和copy。不錯(cuò),就是分別代表深拷貝和淺拷貝。

>>> import copy
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = copy.deepcopy(a)
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> a[1][2]='change'
>>> a
[[1, 2, 3], [4, 5, 'change'], [7, 8, 9]]
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

執(zhí)行深拷貝之后,對(duì)a的修改并不會(huì)影響到b。

0x03 Abstract Base Classes(ABC)

抽象基類的使用

為了說明為什么要使用ABC,我們先看下不使用ABC的情況

# 定義了基類Base
>>> class Base:
	def foo(self):
		raise NotImplemented
	def bar(self):
		raise NotImplemented

# 定義實(shí)現(xiàn)類
>>> class Concrete(Base):
	def foo(self):
		print('called foo')
  
  # 實(shí)現(xiàn)類并沒有實(shí)現(xiàn)bar方法
	
>>> c = Concrete()
>>> c.foo()
called foo
>>> c.bar()
Traceback (most recent call last):
 File "<pyshell#391>", line 1, in <module>
  c.bar()
 File "<pyshell#384>", line 5, in bar
  raise NotImplemented
TypeError: exceptions must derive from BaseException

可以看到?jīng)]有實(shí)現(xiàn)基類bar方法的Concrete類,依然可以使用,并沒有在第一時(shí)間拋出錯(cuò)誤。

要解決這個(gè)問題,就要用到我們abc模塊了。

from abc import ABC
# 定義基類,繼承于ABC
>>> class Base(ABC):
	@abstractmethod
	def foo(self):
		pass
	@abstractmethod
	def bar(self):
		pass

	
>>> class Concrete(Base):
	def foo(self):
		print("called foo")
	# 實(shí)現(xiàn)類并沒有實(shí)現(xiàn)bar方法

>>> c = Concrete()
Traceback (most recent call last):
 File "<pyshell#357>", line 1, in <module>
  c = Concrete()
TypeError: Can't instantiate abstract class Concrete with abstract methods bar

可以看到,在使用Concrete構(gòu)造方法的時(shí)候,就立即拋出TypeError了。

0x04 使用namedtuple的好處

關(guān)于namedtuple的用法在前面的文章《如何在Python中表示一個(gè)對(duì)象》 也有提到。

簡(jiǎn)單的說namedtuple是一個(gè)可以命名的tuple,他是對(duì)tuple的擴(kuò)展,它有跟tuple一樣不可變的屬性。

對(duì)于一些數(shù)據(jù)類的定義,namedtuple使用起來非常方便

>>> from collections import namedtuple
>>> Point = namedtuple('Point','x y z')
>>> p = Point(1,3,5)
>>> p
Point(x=1, y=3, z=5)
>>> p.x
1
>>> p.y = 3.5
AttributeError: can't set attribute
# 可以看出通過namedtuple定義對(duì)象,就是一個(gè)class類型的
>>> type(p)
<class '__main__.Point'>

還可以使用它內(nèi)部的一些工具方法,在實(shí)際的編碼當(dāng)中也是非常實(shí)用的。

# 轉(zhuǎn)化為dict
>>> p._asdict()
OrderedDict([('x', 1), ('y', 3), ('z', 5)])
# 更新或替換某個(gè)屬性值
>>> p._replace(x=111)
Point(x=111, y=3, z=5)
# 使用_make創(chuàng)建新對(duì)象
>>> Point._make([333,666,999])
Point(x=333, y=666, z=999)

0x05 類變量和實(shí)例變量

Python中對(duì)象的屬性類型有實(shí)例變量和類變量。

類變量是屬于類的,它存儲(chǔ)在“類的內(nèi)存空間”里,并能夠被它的各個(gè)實(shí)例對(duì)象共享。而實(shí)例變量是屬于某個(gè)特定實(shí)例的,它不在“類的內(nèi)存空間”中,它是獨(dú)立于各個(gè)實(shí)例存在的。

>>> class Cat:
	num_legs = 4
	
>>> class Cat:
	num_legs = 4
	def __init__(self,name):
		self.name = name

>>> tom = Cat('tom')
>>> jack = Cat('jack')
>>> tom.name,jack.name
('tom', 'jack')
>>> tom.num_legs,jack.num_legs
(4, 4)
>>> Cat.num_legs
4

這里定義了一個(gè)貓類,它有一個(gè)實(shí)例變量name,還有一個(gè)類變量num_legs,這個(gè)是各個(gè)實(shí)例共享的。

如果對(duì)類變量進(jìn)行,那么其它實(shí)例也會(huì)同步修改。而對(duì)某個(gè)實(shí)例對(duì)修改,并不會(huì)影響都類變量。

>>> Cat.num_legs = 6
>>> tom.num_legs,jack.num_legs
(6, 6)
>>> tom.num_legs = 2
>>> tom.num_legs,jack.num_legs
(2, 6)
>>> Cat.num_legs
6

tom.num_legs = 2這個(gè)語(yǔ)句都作用其實(shí)對(duì)tom這個(gè)實(shí)例增加了一個(gè)屬性,只不過這個(gè)屬性名稱跟類屬性的名稱是一致的。

0x06 實(shí)例方法、類方法和靜態(tài)方法

為了更好區(qū)分,我們還是來看代碼

>>> class MyClass:
	def method(self):
		print(f"instance method at {self}" )
	@classmethod
	def classmethod(cls):
		print(f'classmethod at {cls}')
	@staticmethod
	def staticmethod():
		print('staticmethod')

		
>>> mc = MyClass()
>>> mc.method
<bound method MyClass.method of <__main__.MyClass object at 0x10c280b00>>
>>> mc.classmethod
<bound method MyClass.classmethod of <class '__main__.MyClass'>>
>>> mc.staticmethod
<function MyClass.staticmethod at 0x1090d4378>

可以看到在MyClass中分別定義實(shí)例方法(method)、類方法(classmethod)和靜態(tài)方法(staticmethod)

在Python中一切都是對(duì)象,所以我打印來一下各個(gè)方法的__repr__輸出。

對(duì)于實(shí)例方法method是綁定在MyClass的具體實(shí)現(xiàn)對(duì)象中的,而類方法classmethod是綁定在MyClass中的,而靜態(tài)方法staticmethod既不綁定在實(shí)例里,也不綁定在類中,它就是一個(gè)function對(duì)象實(shí)例方法的調(diào)用,需要傳遞一個(gè)實(shí)例對(duì)象到實(shí)例方法中,以下兩種方法的調(diào)用是等價(jià)的。

>>> mc.method()
instance method at <__main__.MyClass object at 0x10910ada0>
>>> MyClass.method(mc)
instance method at <__main__.MyClass object at 0x10910ada0>

類方法的調(diào)用和靜態(tài)方法的調(diào)用都是使用ClassName.methodName()的方式。

>>> MyClass.classmethod()
classmethod at <class '__main__.MyClass'>
>>> MyClass.staticmethod()
staticmethod

類方法和靜態(tài)方法有什么區(qū)別呢?

  • 首先在前面可以看到類方法和靜態(tài)方法的對(duì)象是不一樣的,一個(gè)是bound method,一個(gè)是function。

  • 其次類方法可以訪問到類對(duì)象MyClass,而靜態(tài)方法不能。

  • 最后靜態(tài)方法其實(shí)跟一個(gè)普通的function對(duì)象一樣,只不過它是屬于類命名空間的。

0x07 總結(jié)一下

本文主要對(duì)Python中一些常見的面向?qū)ο蟮南嚓P(guān)的一些特性進(jìn)行了說明。包括對(duì)象的比較、輸出、拷貝等操作,以及推薦使用namedtuple定義數(shù)據(jù)類。最后對(duì)類變量和實(shí)例變量以及類方法、實(shí)例方法和靜態(tài)方法的不同作了分析。

感謝各位的閱讀,以上就是“Python中面向?qū)ο蟮某S弥R(shí)點(diǎn)總結(jié)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python中面向?qū)ο蟮某S弥R(shí)點(diǎn)總結(jié)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱:Python中面向?qū)ο蟮某S弥R(shí)點(diǎn)總結(jié)-創(chuàng)新互聯(lián)
文章URL:http://aaarwkj.com/article34/cogcpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、小程序開發(fā)定制網(wǎng)站、網(wǎng)站排名、Google、面包屑導(dǎo)航

廣告

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

成都網(wǎng)頁(yè)設(shè)計(jì)公司
成人偷拍自拍在线视频| 国产69精品久久一级| 免费视频观看在线一区二区三区| 国产成人精品亚洲日本片| 日韩亚洲欧美另类精品| 免费人成视频在线观看不卡| 日韩精品欧美精品视频一区| 国产欧美日韩精品国产| 亚洲欧美日韩国产桃色| 国产激情盗摄一区二区三区| 中文免费在线观看av| 夫妻性生活免费看视频| 国产av不卡二区三区| 国产av网站精品成人| 欧美黄片视频免费观看| 日韩色欧美色国产精品| 国产三级精品在线免费| 精品人妻一区二区三区四| 国产女孩精品在线播放| 成人av久久一区二区三区| 99国产精品欧美一区二区| 国产亚洲国产av网站在线| 久久草福利视频在线观看| 五月婷婷六月丁香激情视频| 99精品人妻一区二区三区蜜桃| 日本在线有码中文视频| 视频一区二区三区拍拍| 热久久这里只有精品网址| 久久国产高清亚洲电影| av在线免费播放观看| 国产福利精品一区二区av| 国产一级r内射视频播放| 欧美国产成人精品一区| 永久免费观看黄色录像| 午夜精品久久久免费视频| 日本精品视频免费网| 天堂中文字幕在线乱码一区| av成人黄色片在线播放| 日韩一区二区三区视频在线看| 久久精品熟女亚洲av韩国| 久久这里有精品免费观看|