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

一文詳解python中dataclass的使用技巧

 更新時間:2024年03月18日 08:20:38   作者:databook  
dataclass是從Python3.7版本開始,作為標(biāo)準(zhǔn)庫中的模塊被引入,隨著Python版本的不斷更新,dataclass也逐步發(fā)展和完善,為Python開發(fā)者提供了更加便捷的數(shù)據(jù)類創(chuàng)建和管理方式,本文總結(jié)了幾個我平時使用較多dataclass技巧,需要的朋友可以參考下

引言

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

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

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

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

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ù)來初始化對象的各個屬性。

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

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

運行結(jié)果:

<__main__.CoinTrans object at 0x0000022A891FADD0>

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

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

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

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

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

2. dataclass裝飾器定義類

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

from dataclasses import dataclass

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

再次運行:

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裝飾之后,就可以打印出對象的具體內(nèi)容。

2.1. 默認值

dataclass裝飾器的方式來定義類,設(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)

運行之后發(fā)現(xiàn),在addrs屬性那行會報錯:

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

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

我們只要定義個函數(shù)來產(chǎ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)

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

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

2.2. 隱藏敏感信息

我們打印對象信息的時候,有時執(zhí)行打印其中幾個屬性的信息,涉及敏感信息的屬性不希望打印出來。
比如,上面的對象,如果不想打印出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)

再次運行后顯示:

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

2.3. 只讀對象

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

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

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

運行結(jié)果:

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

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

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

再次運行,會發(fā)現(xiàn)修改屬性會觸發(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模塊還提供了兩個函數(shù)可以很方便的將數(shù)據(jù)類轉(zhuǎn)換為元組字典。
這在和其他分析程序交互時非常有用,因為和其他程序交互時,參數(shù)一般都用元組或者字典這種簡單通用的結(jié)構(gòu),
而不會直接用自己定義的數(shù)據(jù)類。

from dataclasses import dataclass, field, astuple, asdict

if __name__ == "__main__":
    coin_trans = CoinTrans()
    print(astuple(coin_trans))
    print(asdict(coin_trans))

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

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

以上就是一文詳解python中dataclass的使用技巧的詳細內(nèi)容,更多關(guān)于python dataclass使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用python對excel表格處理的一些小功能

    使用python對excel表格處理的一些小功能

    這篇文章主要介紹了使用python對excel表格處理的一些小功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • python encrypt 實現(xiàn)AES加密的實例詳解

    python encrypt 實現(xiàn)AES加密的實例詳解

    在本篇文章里小編給大家分享的是關(guān)于python encrypt 實現(xiàn)AES加密的實例內(nèi)容,有興趣的朋友們可以參考下。
    2020-02-02
  • Python中CairoSVG庫的使用教程

    Python中CairoSVG庫的使用教程

    CairoSVG是一個強大的Python庫,用于將SVG圖像轉(zhuǎn)換為PNG、PDF、PS等格式,本文就來介紹一下Python中CairoSVG庫的使用教程,感興趣的可以了解一下
    2025-01-01
  • Python基于OpenAI?API輕松實現(xiàn)PDF發(fā)票信息提取

    Python基于OpenAI?API輕松實現(xiàn)PDF發(fā)票信息提取

    在日常辦公中,企業(yè)和個人經(jīng)常需要處理大量的發(fā)票數(shù)據(jù),本文將介紹如何利用?OpenAI?API?和?PyMuPDF?(即?fitz)?實現(xiàn)?PDF?發(fā)票的自動信息提取,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-03-03
  • Python查找多個字典公共鍵key的方法

    Python查找多個字典公共鍵key的方法

    這篇文章主要介紹了Python查找多個字典公共鍵key案例,文章主要通過案例分享展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • 利用Selenium添加cookie實現(xiàn)自動登錄的示例代碼(fofa)

    利用Selenium添加cookie實現(xiàn)自動登錄的示例代碼(fofa)

    這篇文章主要介紹了利用Selenium添加cookie實現(xiàn)自動登錄的示例代碼(fofa),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 詳細介紹python類及類的用法

    詳細介紹python類及類的用法

    前面我們介紹了類的創(chuàng)建及面向?qū)ο蟮娜筇匦?本篇將詳細介紹Python 類的成員,成員修飾符,類的特殊成員.需要的朋友可以參考下
    2021-05-05
  • python3如何去除字符串中的特殊字符

    python3如何去除字符串中的特殊字符

    這篇文章主要介紹了python3如何去除字符串中的特殊字符,在平時處理字符串的時候,經(jīng)常會遇到字符串中夾雜著我們不希望看到的特殊字符,那么如何處理這些特殊字符呢,今天就跟著小編來看看吧
    2023-04-04
  • pandas?dataframe按照列名給列排序三種方法

    pandas?dataframe按照列名給列排序三種方法

    這篇文章主要給大家介紹了關(guān)于pandas?dataframe按照列名給列排序的三種方法,在進行數(shù)據(jù)分析操作時,經(jīng)常需要對數(shù)據(jù)按照某行某列排序,或者按照多行多列排序,以及按照索引值排序等等,需要的朋友可以參考下
    2023-07-07
  • Python3中Sanic中間件的使用

    Python3中Sanic中間件的使用

    Sanic框架中的中間件是一種強大的工具,本文就來介紹Python3中Sanic中間件的使用,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01

最新評論

同江市| 旬邑县| 宾川县| 亚东县| 宝丰县| 彰化市| 安多县| 虎林市| 尼玛县| 屯门区| 阿克苏市| 玉树县| 玉山县| 田林县| 扶绥县| 凤冈县| 永德县| 宝坻区| 盐山县| 辽阳市| 齐齐哈尔市| 乐都县| 灵台县| 天祝| 青海省| 泸州市| 曲阜市| 永安市| 化德县| 牟定县| 思南县| 崇仁县| 东阳市| 兰坪| 桂平市| 松溪县| 三江| 类乌齐县| 沙洋县| 阿拉尔市| 察雅县|