成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文帶你走進Python中的數據類

開發 后端 大數據
數據類適用于Python3.7或更高版本,它不僅可以用作數據容器,還可以編寫樣板代碼,簡化創建類的過程。

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

 

一文帶你走進Python中的數據類

創建第一個數據類

創建一個數據類,該數據類表示三維坐標系中的一個點。

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

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

默認情況下,數據類附帶有init、repr和 eq方法,因此我們不必自己實現。但是如果init、repr和eq沒有在Coordinate類中實現,有了數據類,我們仍然可以使用這些方法,這樣非常節省時間。

  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) 

字段的默認值

編碼者可以為字段分配默認值。如下所示,數據類中的pi字段被分配了默認值:

  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 

自定義字段和數據類

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

數據類可變還是不可變?

默認情況下,數據類是可變的,這意味著可以為字段分配值。但我們可以通過將frozen參數設置為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 

不可變示例:

設置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' 

比較數據類

假設要創建一個表示Vector的數據類并進行比較,你會怎么做?當然需要使用諸如lt或gt之類的方法啦。

默認情況下,數據類的order參數為 False。將其設置為True,會自動為數據類生成 lt、le、gt和ge方法。因此,可以按順序比較對象,就像它們是其字段的元組一樣。

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

回想一下,元組比較是逐個按照順序進行的。首先將8和7進行比較,結果為True,那么比較結果就為True。如果它們相等,則比較15> 20,結果為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) 

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

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

還可以使用數據類中的field函數來自定義magnitude字段。通過將init設置為False,基本可以不需要init方法中的magnitude參數。因為初始化后才使用post_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)  # outputTrue 

將數據類轉換為字典或元組

從元組或字典中獲取數據類的屬性,只需要從數據類中導入asdict和astuple函數:

  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中的普通類一樣對數據類進行子類化:

  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) 

使用繼承時經常會忽視一點:默認情況下,當將lang字段設置為Python時,必須為lang字段之后的字段提供默認值:

  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方法。回想一下,具有默認值的參數應該位于沒有默認值的參數之后:

 

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

通過對sanlary字段設置默認值來對其進行修復:

  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的好處

默認情況下,屬性存儲在字典中。使用slots可以更快地訪問屬性并且內存占用更少。

  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內存占用更小,訪問屬性更快。

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

數據類參數

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

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

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

字段參數

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

以上就是關于Python中數據類的簡要介紹,你掌握了嗎?

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2023-10-26 01:15:09

得物視頻優化

2021-10-13 21:43:18

JVMRPC框架

2021-09-11 10:41:27

PythonPickle模塊

2023-11-03 15:05:41

2021-11-06 10:18:30

Python變量常量

2020-10-08 14:32:57

大數據工具技術

2022-12-20 07:39:46

2023-11-20 08:18:49

Netty服務器

2023-12-21 17:11:21

Containerd管理工具命令行

2023-07-31 08:18:50

Docker參數容器

2023-11-06 08:16:19

APM系統運維

2021-05-29 10:11:00

Kafa數據業務

2022-11-11 19:09:13

架構

2020-05-17 14:55:17

物聯網安全技術

2021-05-07 09:17:21

HTTPTCP協議

2021-12-01 11:40:14

Python 輸入輸出

2019-07-04 15:16:52

數據挖掘大數據算法

2024-05-07 08:49:36

Hadoop數據存儲-分布式存儲

2020-06-05 14:15:29

可視化數據集分析

2022-02-24 07:34:10

SSL協議加密
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美9999| 成人做爰9片免费看网站 | 久久一二区 | 日韩视频精品在线 | 亚洲一二三区不卡 | 日韩在线一区视频 | 国产一区二区三区精品久久久 | 亚洲国产精品一区二区第一页 | 久色激情 | www.日本在线 | 欧美亚洲另类在线 | 国产精品一区二区免费 | 欧美视频在线看 | 中国美女av | 日韩综合在线视频 | 亚洲欧美一区二区三区国产精品 | 亚洲人一区| www.日韩av.com | 欧美激情亚洲 | 久久精品亚洲精品国产欧美kt∨ | 免费一级毛片 | 日日夜夜精品视频 | 日韩精品区 | 久久天天躁狠狠躁夜夜躁2014 | 国产精品资源在线观看 | 玖玖色在线视频 | 国产一级黄色网 | 国产精品毛片 | 欧美啪啪 | 国产一级一级 | 欧美一区2区三区4区公司二百 | 一区二区三区国产好 | 天天干天天玩天天操 | 国产色网站 | 在线一区观看 | 亚洲精品一区二三区不卡 | 中文字幕乱码视频32 | 男女羞羞视频在线看 | 中文字幕视频在线观看 | 成人福利片| 日日噜噜夜夜爽爽狠狠 |