国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

掌握python的dataclass,讓你的代碼更簡潔優(yōu)雅

這篇具有很好參考價值的文章主要介紹了掌握python的dataclass,讓你的代碼更簡潔優(yōu)雅。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

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

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

首先,從平時量化分析的場景中簡化一個關于 幣交易 的類用來演示。
簡化之后,這里只保留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ù)來初始化對象的各個屬性。

通過這個類構造對象并打印:

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

運行結果:

<__main__.CoinTrans object at 0x0000022A891FADD0>

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

傳統(tǒng)的類中,我們如果希望打印出可讀的結果,需要自己去實現(xiàn)__str__函數(shù)。

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

再次運行,結果如下:

交易信息: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)

得到如下結果:

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

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

2.1. 默認值

dataclass裝飾器的方式來定義類,設置默認值很簡單,直接在定義屬性時就可以設置。

@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作為一種可變的類型(引用類型,會有被其他對象意外修改的風險),不能直接作為默認值,需要用工廠方法來產(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的信息,可以設置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ù)據(jù)類只讀,防止不小心篡改了數(shù)據(jù)。

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

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

運行結果:

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

設置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. 轉化為元組和字典

最后,dataclasses模塊還提供了兩個函數(shù)可以很方便的將數(shù)據(jù)類轉換為元組字典。
這在和其他分析程序交互時非常有用,因為和其他程序交互時,參數(shù)一般都用元組或者字典這種簡單通用的結構,
而不會直接用自己定義的數(shù)據(jù)類。

from dataclasses import dataclass, field, astuple, asdict

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

運行結果:

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

3. 總結

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

總的來說,dataclass通過簡化數(shù)據(jù)類的創(chuàng)建和管理過程,提高了開發(fā)效率,是我們在數(shù)據(jù)分析時的一個非常有用的工具。文章來源地址http://www.zghlxwxcb.cn/news/detail-840658.html

到了這里,關于掌握python的dataclass,讓你的代碼更簡潔優(yōu)雅的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 9 個讓你的 Python 代碼更快的小技巧

    哈嘍大家好,我是咸魚 我們經(jīng)常聽到 “Python 太慢了”,“Python 性能不行”這樣的觀點。但是,只要掌握一些編程技巧,就能大幅提升 Python 的運行速度。 今天就讓我們一起來看下讓 Python 性能更高的 9 個小技巧 原文鏈接: https://medium.com/techtofreedom/9-fabulous-python-tricks-that-m

    2024年02月03日
    瀏覽(21)
  • 【學會這幾個VSCode插件,讓你的Python代碼更優(yōu)秀】

    【學會這幾個VSCode插件,讓你的Python代碼更優(yōu)秀】

    VSCode(Visual Studio Code)是由微軟研發(fā)的一款免費、開源的跨平臺文本(代碼)編輯器,一般主要用于輕量級的編程代碼工作,就非常適合Python,同時在前端開發(fā)方面也有舉足輕重的地位。但如果想用于Java代碼編寫就非常不適合了,因為使用Java的工程都比較龐大,我們的Java工

    2023年04月26日
    瀏覽(21)
  • 使用Python繪制跳動的愛心,讓你的代碼也充滿愛意!

    使用Python繪制跳動的愛心,讓你的代碼也充滿愛意!

    今天我要分享一個浪漫小技巧,使用Python中的HTML制作一個立體、動態(tài)的小愛心。通過成千上百個小愛心的組合,形成一個大愛心,從內到外呈現(xiàn)出立體的效果,給人帶來強烈的視覺沖擊。這個小技巧非常浪漫,讓人感受到愛的力量。 一.粉色愛心 運行結果: ?二.藍色動態(tài)

    2024年02月08日
    瀏覽(27)
  • 6種打包Python代碼的方法,讓你的程序變成exe應用!

    Python是一種高級編程語言,它具有易學易用、跨平臺等優(yōu)點,因此在開發(fā)中得到了廣泛的應用。 然而,Python代碼需要在Python解釋器中運行,這對于一些用戶來說可能不太方便。 因此,將Python代碼打包成可執(zhí)行文件(exe)是一種很好的解決方案。 本文將介紹6種將Python代碼打包

    2024年02月16日
    瀏覽(18)
  • 6種打包Python代碼的方法,讓你的程序變成exe應用

    Python是一種高級編程語言,它具有易學易用、跨平臺等優(yōu)點,因此在開發(fā)中得到了廣泛的應用。 然而,Python代碼需要在Python解釋器中運行,這對于一些用戶來說可能不太方便。 因此,將Python代碼打包成可執(zhí)行文件(exe)是一種很好的解決方案。 本文將介紹6種將Python代碼打包

    2024年01月18日
    瀏覽(21)
  • 3 個可以使你的 Python 代碼更優(yōu)雅、可讀、直觀和易于維護的工具

    3 個可以使你的 Python 代碼更優(yōu)雅、可讀、直觀和易于維護的工具

    Python 提供了一組獨特的工具和語言特性來使你的代碼更加優(yōu)雅、可讀和直觀。 為正確的問題選擇合適的工具,你的代碼將更易于維護。 粉絲福利!私信回復【01】有基礎教程一套 讓我們創(chuàng)建一個 Money 類來示例: 如下所示: 現(xiàn)在我們可以以非常直觀的方式使用這個類: 例如

    2023年04月11日
    瀏覽(20)
  • 讓你的代碼動起來:Python進度條神器tqdm詳解及應用實例

    各位Python高手,今天我要給大家介紹一個好用的庫,它就是: tqdm tqdm在阿拉伯語中的意思是 \\\"進展\\\",所以這個庫也被稱為 \\\"快速進展條\\\"。不得不說,這個名字真的很有創(chuàng)意! 讓我們想象一下,你正在運行一個耗時的數(shù)據(jù)處理任務或者訓練一個復雜的深度學習模型。你坐在那

    2024年02月07日
    瀏覽(31)
  • 實戰(zhàn)演示:使用Python編寫人臉識別測試代碼,讓你的應用擁有智能感知能力

    人臉識別是計算機視覺領域的一個重要應用。它使用計算機算法來識別和驗證面部特征,通常用于安全認證、視頻監(jiān)控、人臉比對等方面。近年來,隨著深度學習技術的發(fā)展,人臉識別的性能得到了極大的提升,成為了智能感知應用中的重要一環(huán)。在這篇文章中,我們將使用

    2024年02月12日
    瀏覽(22)
  • 掌握這5款 Edge插件,讓你的瀏覽器使用更高效!

    掌握這5款 Edge插件,讓你的瀏覽器使用更高效!

    您好,今天我想向您推薦兩款不常用的 Edge 插件,它們可以幫助您更高效地瀏覽網(wǎng)頁和管理標簽頁。這些插件可能不像一些常見的插件那樣廣為人知,但它們的功能卻非常實用。 IHome新標簽頁插件 下載地址: https://microsoftedge.microsoft.com/addons/detail/ihome%E5%8E%9Fbdtab%E6%96%B0%E6%A0%

    2024年02月04日
    瀏覽(25)
  • 如何優(yōu)雅地在Spring Boot項目啟動時初始化數(shù)據(jù),讓你的Web應用快人一步

    如何優(yōu)雅地在Spring Boot項目啟動時初始化數(shù)據(jù),讓你的Web應用快人一步

    ?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正! 大多數(shù)Java Web應用程序中,項目在啟動時都需要加載一些初始化數(shù)據(jù),例如配置文件、數(shù)據(jù)庫連接信息等。在Spring Boot中,我們可以通過將數(shù)據(jù)緩存到內存中來提高Web應用程序的性能。本篇博客旨在通過一個實例來介紹如

    2024年02月02日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包