最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

輕松掌握python的dataclass讓你的代碼更簡(jiǎn)潔優(yōu)雅

 更新時(shí)間:2025年01月06日 09:46:17   作者:wang_yb  
本文總結(jié)了幾個(gè)我在使用Python的dataclass時(shí)常用的技巧,dataclass裝飾器可以幫助我們簡(jiǎn)化數(shù)據(jù)類的定義過程,包括設(shè)置默認(rèn)值、隱藏敏感信息、設(shè)置只讀對(duì)象以及將其轉(zhuǎn)化為元組和字典,通過使用dataclass,我們可以更高效地進(jìn)行數(shù)據(jù)分析和處理,感興趣的朋友跟隨小編一起看看吧

dataclass是從Python3.7版本開始,作為標(biāo)準(zhǔn)庫(kù)中的模塊被引入。
隨著Python版本的不斷更新,dataclass也逐步發(fā)展和完善,為Python開發(fā)者提供了更加便捷的數(shù)據(jù)類創(chuàng)建和管理方式。

dataclass的主要功能在于幫助我們簡(jiǎn)化數(shù)據(jù)類的定義過程。
本文總結(jié)了幾個(gè)我平時(shí)使用較多dataclass技巧。

1. 傳統(tǒng)的類定義方式

首先,從平時(shí)量化分析的場(chǎng)景中簡(jiǎn)化一個(gè)關(guān)于 幣交易 的類用來演示。
簡(jiǎn)化之后,這里只保留5個(gè)字段,分別是交易ID,交易對(duì)價(jià)格,是否成功參與交易的地址列表。

class CoinTrans:
    def __init__(
        self,
        id: str,
        symbol: str,
        price: float,
        is_success: bool,
        addrs: list,
    ) -> None:
        self.id = id
        self.symbol = symbol
        self.price = price
        self.addrs = addrs
        self.is_success = is_success

Python傳統(tǒng)定義類的方式,如上通過__init__函數(shù)來初始化對(duì)象的各個(gè)屬性。

通過這個(gè)類構(gòu)造對(duì)象并打?。?/p>

if __name__ == "__main__":
    coin_trans = CoinTrans("id01", "BTC/USDT", "71000", True, ["0x1111", "0x2222"])
    print(coin_trans)

運(yùn)行結(jié)果:

<__main__.CoinTrans object at 0x0000022A891FADD0>

這里只是打印出對(duì)象的地址,并沒有按照我們期望的那樣打印對(duì)象各個(gè)屬性的值。

傳統(tǒng)的類中,我們?nèi)绻M蛴〕隹勺x的結(jié)果,需要自己去實(shí)現(xiàn)__str__函數(shù)。

# 在上面的 CoinTrans 類中添加下面的方法
def __str__(self) -> str:
    return f"交易信息:{self.id}, {self.symbol}, {self.price}, {self.addrs}, {self.is_success}"

再次運(yùn)行,結(jié)果如下:

交易信息:id01, BTC/USDT, 71000, ['0x1111', '0x2222'], True

2. dataclass裝飾器定義類

下面看看使用dataclass裝飾器來定義上面同樣的類有多簡(jiǎn)單。

from dataclasses import dataclass
@dataclass
class CoinTrans:
    id: str
    symbol: str
    price: float
    is_success: bool
    addrs: list

再次運(yùn)行:

if __name__ == "__main__":
    coin_trans = CoinTrans("id01", "BTC/USDT", "71000", True, ["0x1111", "0x2222"])
    print(coin_trans)

得到如下結(jié)果:

CoinTrans(id='id01', symbol='BTC/USDT', price='71000', is_success=True, addrs=['0x1111', '0x2222'])

不需要__init__,也不需要__str__,只要通過 @dataclass裝飾之后,就可以打印出對(duì)象的具體內(nèi)容。

2.1. 默認(rèn)值

dataclass裝飾器的方式來定義類,設(shè)置默認(rèn)值很簡(jiǎn)單,直接在定義屬性時(shí)就可以設(shè)置。

@dataclass
class CoinTrans:
    id: str = "id01"
    symbol: str = "BTC/USDT"
    price: float = "71000.8"
    is_success: bool = True
    addrs: list[str] = ["0x1111", "0x2222"]
if __name__ == "__main__":
    coin_trans = CoinTrans()
    print(coin_trans)

運(yùn)行之后發(fā)現(xiàn),在addrs屬性那行會(huì)報(bào)錯(cuò):

ValueError: mutable default <class 'list'> for field addrs is not allowed: use default_factory

大概的意思就是,list作為一種可變的類型(引用類型,會(huì)有被其他對(duì)象意外修改的風(fēng)險(xiǎn)),不能直接作為默認(rèn)值,需要用工廠方法來產(chǎn)生默認(rèn)值。
其他字符串,數(shù)值,布爾類型的數(shù)據(jù)則沒有這個(gè)問題。

我們只要定義個(gè)函數(shù)來產(chǎn)生此默認(rèn)值即可。

def gen_list():
    return ["0x1111", "0x2222"]
@dataclass
class CoinTrans:
    id: str = "id01"
    symbol: str = "BTC/USDT"
    price: float = "71000.8"
    is_success: bool = True
    addrs: list[str] = field(default_factory=gen_list)
if __name__ == "__main__":
    coin_trans = CoinTrans()
    print(coin_trans)

再次運(yùn)行,可以正常執(zhí)行:

CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8', is_success=True, addrs=['0x1111', '0x2222']

2.2. 隱藏敏感信息

我們打印對(duì)象信息的時(shí)候,有時(shí)執(zhí)行打印其中幾個(gè)屬性的信息,涉及敏感信息的屬性不希望打印出來。
比如,上面的對(duì)象,如果不想打印出is_successaddrs的信息,可以設(shè)置repr=False。

@dataclass
class CoinTrans:
    id: str = "id01"
    symbol: str = "BTC/USDT"
    price: float = "71000.8"
    is_success: bool = field(default=True, repr=False)
    addrs: list[str] = field(default_factory=gen_list, repr=False)

再次運(yùn)行后顯示:

CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8')

2.3. 只讀對(duì)象

數(shù)據(jù)分析時(shí),大部分下情況下,原始數(shù)據(jù)讀取之后是不能修改的。
這種情況下,我們可以用dataclassfrozen屬性來設(shè)置數(shù)據(jù)類只讀,防止不小心篡改了數(shù)據(jù)。

未設(shè)置frozen屬性之前,可以隨意修改對(duì)象的屬性,比如:

if __name__ == "__main__":
    coin_trans = CoinTrans()
    print(f"修改前: {coin_trans}")
    coin_trans.symbol = "ETH/USDT"
    print(f"修改后: {coin_trans}")

運(yùn)行結(jié)果:

修改前: CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8')
修改后: CoinTrans(id='id01', symbol='ETH/USDT', price='71000.8')

設(shè)置frozen屬性之后,看看修改屬性值會(huì)怎么樣:

@dataclass(frozen=True)
class CoinTrans:
    id: str = "id01"
    #... 省略 ...

再次運(yùn)行,會(huì)發(fā)現(xiàn)修改屬性會(huì)觸發(fā)異常。

修改前: CoinTrans(id='id01', symbol='BTC/USDT', price='71000.8')
Traceback (most recent call last):
  File "D:\projects\python\samples\data_classes\main.py", line 66, in <module>
    coin_trans.symbol = "ETH/USDT"
    ^^^^^^^^^^^^^^^^^
  File "<string>", line 4, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'symbol'

2.4. 轉(zhuǎn)化為元組和字典

最后,dataclasses模塊還提供了兩個(gè)函數(shù)可以很方便的將數(shù)據(jù)類轉(zhuǎn)換為元組字典。
這在和其他分析程序交互時(shí)非常有用,因?yàn)楹推渌绦蚪换r(shí),參數(shù)一般都用元組或者字典這種簡(jiǎn)單通用的結(jié)構(gòu),
而不會(huì)直接用自己定義的數(shù)據(jù)類。

from dataclasses import dataclass, field, astuple, asdict
if __name__ == "__main__":
    coin_trans = CoinTrans()
    print(astuple(coin_trans))
    print(asdict(coin_trans))

運(yùn)行結(jié)果:

('id01', 'BTC/USDT', '71000.8', True, ['0x1111', '0x2222'])
{'id': 'id01', 'symbol': 'BTC/USDT', 'price': '71000.8', 'is_success': True, 'addrs': ['0x1111', '0x2222']}

3. 總結(jié)

Python中,數(shù)據(jù)類主要用于存儲(chǔ)數(shù)據(jù),并通常包含屬性和方法來操作這些數(shù)據(jù)。
然而,在定義數(shù)據(jù)類時(shí),我們通常需要編寫一些重復(fù)性的代碼,如構(gòu)造函數(shù)、屬性訪問器和字符串表示等。
dataclass裝飾器的出現(xiàn),使得這些通用方法的生成變得自動(dòng)化,從而極大地簡(jiǎn)化了數(shù)據(jù)類的定義過程。

總的來說,dataclass通過簡(jiǎn)化數(shù)據(jù)類的創(chuàng)建和管理過程,提高了開發(fā)效率,是我們?cè)跀?shù)據(jù)分析時(shí)的一個(gè)非常有用的工具。

到此這篇關(guān)于掌握python的dataclass,讓你的代碼更簡(jiǎn)潔優(yōu)雅的文章就介紹到這了,更多相關(guān)python dataclass內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Python中函數(shù)的幾種形參

    關(guān)于Python中函數(shù)的幾種形參

    這篇文章主要介紹了關(guān)于Python中函數(shù)的幾種形參,python中函數(shù)是非常重要的一個(gè)知識(shí)點(diǎn),想要把函數(shù)學(xué)習(xí)好,就必須要把函數(shù)的參數(shù)學(xué)習(xí)好,這樣才能夠進(jìn)行很好的傳遞參數(shù),發(fā)揮出應(yīng)有的作用,需要的朋友可以參考下
    2023-08-08
  • 將Django使用的數(shù)據(jù)庫(kù)從MySQL遷移到PostgreSQL的教程

    將Django使用的數(shù)據(jù)庫(kù)從MySQL遷移到PostgreSQL的教程

    這篇文章主要介紹了將Django使用的數(shù)據(jù)庫(kù)從MySQL遷移到PostgreSQL的教程,同時(shí)提到了一些注意事項(xiàng),需要的朋友可以參考下
    2015-04-04
  • flask框架url與重定向操作實(shí)例詳解

    flask框架url與重定向操作實(shí)例詳解

    這篇文章主要介紹了flask框架url與重定向操作,結(jié)合實(shí)例形式詳細(xì)分析了flask框架URL映射、傳參、重定向等相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • 用python寫個(gè)博客遷移工具

    用python寫個(gè)博客遷移工具

    這篇文章主要介紹了如何用python寫個(gè)博客遷移工具,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python中獲取列表元素?cái)?shù)量的多種實(shí)現(xiàn)方式

    Python中獲取列表元素?cái)?shù)量的多種實(shí)現(xiàn)方式

    在Python編程中,經(jīng)常需要獲取列表的元素?cái)?shù)量,也就是列表的長(zhǎng)度,這在進(jìn)行數(shù)據(jù)處理、循環(huán)操作等場(chǎng)景中非常常見,Python提供了多種方式來實(shí)現(xiàn)這一需求,每種方式都有其特點(diǎn)和適用場(chǎng)景,需要的朋友可以參考下
    2025-07-07
  • Spark處理數(shù)據(jù)排序問題如何避免OOM

    Spark處理數(shù)據(jù)排序問題如何避免OOM

    這篇文章主要介紹了Spark處理數(shù)據(jù)排序問題如何避免OOM,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • WxPython界面如何用pubsub展示進(jìn)程工作的進(jìn)度條

    WxPython界面如何用pubsub展示進(jìn)程工作的進(jìn)度條

    這篇文章主要介紹了WxPython界面如何用pubsub展示進(jìn)程工作的進(jìn)度條,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python常用字符串替換函數(shù)strip、replace及sub用法示例

    Python常用字符串替換函數(shù)strip、replace及sub用法示例

    這篇文章主要介紹了Python常用字符串替換函數(shù)strip、replace及sub用法,結(jié)合實(shí)例形式分析了Python針對(duì)字符串替換的常用函數(shù)strip、replace及sub功能及簡(jiǎn)單使用技巧,需要的朋友可以參考下
    2018-05-05
  • 詳細(xì)總結(jié)Python類的多繼承知識(shí)

    詳細(xì)總結(jié)Python類的多繼承知識(shí)

    Python類的多繼承知識(shí)是非常易于新手理解的,如果你是剛剛?cè)腴TPython的話,歡迎參考本篇文章,本文對(duì)Python類的多繼承知識(shí)作出了非常詳細(xì)的解釋,還有相關(guān)代碼參考哦。
    2021-05-05
  • pytest進(jìn)階教程之fixture函數(shù)詳解

    pytest進(jìn)階教程之fixture函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于pytest進(jìn)階教程之fixture函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

西畴县| 东方市| 保定市| 岳普湖县| 高州市| 上饶县| 娱乐| 宜州市| 新绛县| 定南县| 凤凰县| 凌云县| 周口市| 新昌县| 偏关县| 马边| 三亚市| 姚安县| 敦煌市| 义乌市| 长沙县| 会同县| 开封县| 泰来县| 黔西县| 集贤县| 龙门县| 汽车| 甘孜| 大方县| 邳州市| 仁布县| 夹江县| 丹凤县| 双牌县| 个旧市| 吐鲁番市| 鹤庆县| 金沙县| 澳门| 商水县|