日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一文帶你走進(jìn)Python中的數(shù)據(jù)類

數(shù)據(jù)類適用于Python3.7或更高版本,它不僅可以用作數(shù)據(jù)容器,還可以編寫樣板代碼,簡化創(chuàng)建類的過程。

成都創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為宜城企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),宜城網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

創(chuàng)建第一個(gè)數(shù)據(jù)類

創(chuàng)建一個(gè)數(shù)據(jù)類,該數(shù)據(jù)類表示三維坐標(biāo)系中的一個(gè)點(diǎn)。

@dataclass裝飾器用于創(chuàng)建數(shù)據(jù)類。x,y和z是數(shù)據(jù)類中的字段。注意要使用類型注釋來指定字段的數(shù)據(jù)類型,但是類型注釋不是靜態(tài)類型聲明,這意味著仍然可以為x,y或z字段傳遞除int之外的任何數(shù)據(jù)類型。

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classCoordinate:
  4.               x: int
  5.               y: int
  6.               z: int

默認(rèn)情況下,數(shù)據(jù)類附帶有init、repr和 eq方法,因此我們不必自己實(shí)現(xiàn)。但是如果init、repr和eq沒有在Coordinate類中實(shí)現(xiàn),有了數(shù)據(jù)類,我們?nèi)匀豢梢允褂眠@些方法,這樣非常節(jié)省時(shí)間。

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classCoordinate:
  4.               x: int
  5.               y: int
  6.               z: int
  7.              a =Coordinate(4, 5, 3)
  8.            print(a)  # output: Coordinate(x=4, y=5, z=3)

字段的默認(rèn)值

編碼者可以為字段分配默認(rèn)值。如下所示,數(shù)據(jù)類中的pi字段被分配了默認(rèn)值:

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classCircleArea:
  4.               r: int
  5.               pi: float =3.14
  6.                  @property
  7.               defarea(self):
  8.                    return self.pi * (self.r **2)
  9.              a =CircleArea(2)
  10.            print(repr(a))  # output: CircleArea(r=2, pi=3.14)
  11.            print(a.area)  # output: 12.56

自定義字段和數(shù)據(jù)類

設(shè)置dataclass裝飾器或field函數(shù)的參數(shù)可以自定義字段和數(shù)據(jù)類。自定義過程將用例子進(jìn)行說明,本文結(jié)尾也會(huì)給出字段和數(shù)據(jù)類的所有參數(shù)。

數(shù)據(jù)類可變還是不可變?

默認(rèn)情況下,數(shù)據(jù)類是可變的,這意味著可以為字段分配值。但我們可以通過將frozen參數(shù)設(shè)置為True來使其不可變

可變示例:

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classCircleArea:
  4.               r: int
  5.               pi: float =3.14
  6.                  @property
  7.               defarea(self):
  8.                    return self.pi * (self.r **2)
  9.              a =CircleArea(2)
  10.            a.r =5
  11.            print(repr(a))  # output: CircleArea(r=5, pi=3.14)
  12.            print(a.area)  # output: 78.5

不可變示例:

設(shè)置frozen為 True,將無法再為字段分配值。在下面的示例中可以看到異常輸出。

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass(frozen=True)
  3.            classCircleArea:
  4.               r: int
  5.               pi: float =3.14
  6.                  @property
  7.               defarea(self):
  8.                    return self.pi * (self.r **2)
  9.              a =CircleArea(2)
  10.            a.r =5
  11.            # Exceptionoccurred: dataclasses.FrozenInstanceError:
  12.            # cannot assign tofield 'r'

比較數(shù)據(jù)類

假設(shè)要?jiǎng)?chuàng)建一個(gè)表示Vector的數(shù)據(jù)類并進(jìn)行比較,你會(huì)怎么做?當(dāng)然需要使用諸如lt或gt之類的方法啦。

默認(rèn)情況下,數(shù)據(jù)類的order參數(shù)為 False。將其設(shè)置為True,會(huì)自動(dòng)為數(shù)據(jù)類生成 lt、le、gt和ge方法。因此,可以按順序比較對(duì)象,就像它們是其字段的元組一樣。

研究下面的示例:將order設(shè)置為True就可以比較v2和v1。這里存在一個(gè)邏輯比較的問題。當(dāng)v2> v1時(shí),它將比較這兩個(gè)向量,例如(8,15)>(7,20)。因此,v2> v1的輸出將為True。

回想一下,元組比較是逐個(gè)按照順序進(jìn)行的。首先將8和7進(jìn)行比較,結(jié)果為True,那么比較結(jié)果就為True。如果它們相等,則比較15> 20,結(jié)果為False:

 
 
 
  1. from dataclasses import dataclass,field
  2.    
  3.                        @dataclass(order=True)
  4.            classVector:
  5.               x: int
  6.               y: int
  7.              v1 =Vector(8, 15)
  8.            v2 =Vector(7, 20)
  9.            print(v2 > v1)

顯然這種比較沒有任何意義。筆者最初想通過向量的大小來比較它們。但問題是,不可能在創(chuàng)建每個(gè)實(shí)例時(shí),都要自己計(jì)算Vector的大小。

在這種情況下,field函數(shù)和post_init方法更有用。field函數(shù)能自定義magnitude字段。而post_init方法則會(huì)確定初始化后該矢量的大小。

還可以使用數(shù)據(jù)類中的field函數(shù)來自定義magnitude字段。通過將init設(shè)置為False,基本可以不需要init方法中的magnitude參數(shù)。因?yàn)槌跏蓟蟛攀褂胮ost_init方法來確定其值:

 
 
 
  1. from dataclasses import dataclass, field
  2.              @dataclass(order=True)
  3.            classVector:
  4.               magnitude: float =field(init=False)
  5.               x: int
  6.               y: int
  7.                  def__post_init__(self):
  8.                    self.magnitude = (self.x **2+ self.y **2) **0.5
  9.              v1 =Vector(9, 12)
  10.            print(v1)  # output: Vector(magnitude=15.0, x=9,y=12)
  11.            v2 =Vector(8, 15)
  12.            print(v2)  # output: Vector(magnitude=17.0, x=8,y=15)
  13.            print(v2 > v1)  # output: True

將數(shù)據(jù)類轉(zhuǎn)換為字典或元組

從元組或字典中獲取數(shù)據(jù)類的屬性,只需要從數(shù)據(jù)類中導(dǎo)入asdict和astuple函數(shù):

 
 
 
  1. from dataclasses import dataclass,asdict, astuple
  2.              @dataclass
  3.            classVector:
  4.               x: int
  5.               y: int
  6.               z: int
  7.              v =Vector(4, 5, 7)
  8.            print(asdict(v))  # output: {'x': 4, 'y': 5, 'z': 7}
  9.            print(astuple(v))  # output: (4, 5, 7)

繼承

可以像Python中的普通類一樣對(duì)數(shù)據(jù)類進(jìn)行子類化:

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classEmployee:
  4.               name: str
  5.               lang: str
  6.              @dataclass
  7.            classDeveloper(Employee):
  8.               salary: int
  9.              Halil=Developer('Halil', 'Python', 5000)
  10.            print(Halil)  # Output: Developer(name='Halil',lang='Python', salary=5000)

使用繼承時(shí)經(jīng)常會(huì)忽視一點(diǎn):默認(rèn)情況下,當(dāng)將lang字段設(shè)置為Python時(shí),必須為lang字段之后的字段提供默認(rèn)值:

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classEmployee:
  4.               name: str
  5.               lang: str ='Python'
  6.              @dataclass
  7.            classDeveloper(Employee):
  8.               salary: int
  9.              Halil=Developer('Halil', 'Python', 5000)
  10.            # Output:TypeError: non-default argument 'salary' follows default argument

原因在于init方法。回想一下,具有默認(rèn)值的參數(shù)應(yīng)該位于沒有默認(rèn)值的參數(shù)之后:

 
 
 
  1. def__init__(name: str,lang: str ='Python', salary: int):
  2. ...

通過對(duì)sanlary字段設(shè)置默認(rèn)值來對(duì)其進(jìn)行修復(fù):

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classEmployee:
  4.               name: str
  5.               lang: str ='Python'
  6.              @dataclass
  7.            classDeveloper(Employee):
  8.               salary: int =0
  9.              Halil=Developer('Halil', 'Python', 5000)
  10.            print(Halil)  # output: Developer(name='Halil',lang='Python', salary=5000)

slots的好處

默認(rèn)情況下,屬性存儲(chǔ)在字典中。使用slots可以更快地訪問屬性并且內(nèi)存占用更少。

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classEmployee:
  4.               name: str
  5.               lang: str
  6.              Halil=Employee('Halil', 'Python')
  7.            print(Halil.__dict__)  # name': 'Halil', 'lang': 'Python'}

slots內(nèi)存占用更小,訪問屬性更快。

 
 
 
  1. from dataclasses import dataclass
  2.              @dataclass
  3.            classEmployee:
  4.               __slots__ = ('name', 'lang')
  5.               name: str
  6.               lang: str
  7.              Halil=Employee('Halil', 'Python')

數(shù)據(jù)類參數(shù)

剛剛我們更改了數(shù)據(jù)類裝飾器中的某些參數(shù),以自定義數(shù)據(jù)類。以下是參數(shù)列表:

  • nit:如果為True,則在數(shù)據(jù)類中生成init方法。(默認(rèn)為True)
  • repr:如果為True,則在數(shù)據(jù)類中生成repr方法。(默認(rèn)為True)
  • eq:如果為True,則在數(shù)據(jù)類中生成eq方法。(默認(rèn)為True)
  • order:如果為True,則在數(shù)據(jù)類中生成lt,le,gt和ge方法。(默認(rèn)為False)
  • unsafe_hash:如果為True,則在數(shù)據(jù)類中生成hash方法。(默認(rèn)為False)
  • frozen:如果為True,則不能給字段分配值。(默認(rèn)為False。)

注意,如果order為True,eq必須也為True,否則將引發(fā)ValueError異常。

字段參數(shù)

  • init:如果為True,則此字段包含在生成的init方法中。(默認(rèn)為True)
  • repr:如果為True,則此字段包含在生成的repr方法中。(默認(rèn)為True)
  • compare:如果為True,則此字段包含在生成的比較和相等方法中。(默認(rèn)為True)
  • hash:如果為True,則此字段包含在生成的hash方法中。(默認(rèn)為None)
  • default:這是此字段的默認(rèn)值(如果提供)。
  • default_factory:當(dāng)該字段需要默認(rèn)值時(shí)將調(diào)用該參數(shù),此時(shí)該參數(shù)必須為零階可調(diào)用參數(shù)對(duì)象。
  • metadata:可以是映射,也可以為空,為空則將其視為空字典。

以上就是關(guān)于Python中數(shù)據(jù)類的簡要介紹,你掌握了嗎?


當(dāng)前標(biāo)題:一文帶你走進(jìn)Python中的數(shù)據(jù)類
當(dāng)前路徑:http://m.5511xx.com/article/dhophsj.html