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

Python數(shù)據(jù)類dataclasses的具體使用

 更新時(shí)間:2025年11月25日 11:01:48   作者:風(fēng)華浪浪  
dataclasses模塊簡化了創(chuàng)建具有默認(rèn)值和自動(dòng)初始化功能的Python類,它能生成__init__、__repr__等方法,并支持序列化、數(shù)據(jù)驗(yàn)證和清理,下面就來具體介紹一下如何使用,感興趣的可以了解一下

一、場景

dataclasses模塊提供了一種方便的方法來創(chuàng)建和管理數(shù)據(jù)對(duì)象
它可以幫助開發(fā)者更容易地創(chuàng)建簡單的類,同時(shí)提供了一些實(shí)用的功能,例如自動(dòng)實(shí)現(xiàn)__init__()、repr()、eq()等方法。

  • 數(shù)據(jù)容器:如果您需要一個(gè)簡單的類來存儲(chǔ)一些數(shù)據(jù),例如配置信息、用戶信息、數(shù)據(jù)記錄等,那么使用dataclass是非常合適的。dataclass可以自動(dòng)為您生成適當(dāng)?shù)膶傩院头椒?,以便您可以輕松地訪問和修改數(shù)據(jù)。
  • 數(shù)據(jù)對(duì)象:如果您的代碼需要處理大量的數(shù)據(jù)對(duì)象,例如在數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、自然語言處理等領(lǐng)域中,那么使用dataclass可以使代碼更加清晰易讀,減少手動(dòng)編寫大量的屬性和方法的重復(fù)性工作。
  • 序列化和反序列化:dataclass可以幫助您更輕松地將對(duì)象序列化為JSON、XML等格式,并在需要時(shí)將其反序列化。這使得處理不同系統(tǒng)之間的數(shù)據(jù)交換變得更加容易。
  • 數(shù)據(jù)驗(yàn)證和清理:在某些情況下,您可能需要在將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫或發(fā)送到其他系統(tǒng)之前對(duì)其進(jìn)行驗(yàn)證和清理。使用dataclass可以使這個(gè)過程更加簡單和可靠。

二、基礎(chǔ)用法

from dataclasses import dataclass, field, asdict, astuple
from typing import List, Any

@dataclass
class Book:
    name: str
    author: str
    # extend: Any = 'hello world'   # 擴(kuò)展字段 僅做記錄
    publication: str = field(metadata={"description": "出版日期"})
    num: int = field(default=1, metadata={"description": "數(shù)量"})
    price: float = field(default=0.0, metadata={'currency': 'RMB'})
    category: List[str] = field(default_factory=list, repr=False, metadata={"description": "圖書類別"})

    def __post_init__(self):
        # 方法來確保書名的每個(gè)單詞的首字母都是大寫的
        self.name = self.name.title()
        self.title = self.name.upper()

    def is_expensive(self):
        # 檢查一本書是否價(jià)格高于100
        return self.price > 30.0

    def total_amount(self):

        return self.price * self.num

如何調(diào)用

book = Book(name="Under the sky", author="sanxian", price=37.82, publication="2022-11-07", category=['武俠', '古風(fēng)'])
book = Book(**{"name": "the three body problem", "author": "劉慈欣", "price": 37.82, "publication": "2022-12-23", "category": ['科幻', '懸疑']})
print(book.name, book.author)
print(book.title)

print(book.is_expensive())
print(book.total_amount())

book.price = 27.5  # 修改價(jià)格屬性
print(book.is_expensive())  # 輸出:True

print(asdict(book))
print(astuple(book))
The Three Body Problem 劉慈欣 2022-12-23 37.82
THE THREE BODY PROBLEM
True
37.82
False
{'name': 'The Three Body Problem', 'author': '劉慈欣', 'publication': '2022-12-23', 'num': 1, 'price': 27.5, 'category': ['科幻', '懸疑']}
('The Three Body Problem', '劉慈欣', '2022-12-23', 1, 27.5, ['科幻', '懸疑'])

三、中級(jí)用法

裝飾器參數(shù) dataclasses.dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)

參數(shù)名稱默認(rèn)值是否生成方法說明
initTrue__init__是否生成 __init__ 方法
reprTrue__repr__是否生成 __repr__ 方法
eqTrue__eq__是否生成 __eq__ 方法
orderFalse<, <=, >, >=是否生成比較方法
unsafe_hashFalse__hash__是否生成 __hash__ 方法
frozenFalse不可變類是否生成不可變類

init 參數(shù)控制是否生成 init 方法。當(dāng)設(shè)置為 True 時(shí),會(huì)自動(dòng)生成 init 方法;當(dāng)設(shè)置為 False 時(shí),不會(huì)生成 init 方法。

@dataclass(init=False)
class Person:
    name: str
    age: int

    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

p = Person("zhangsan", 30)
print(p.name) # 輸出: Alice
print(p.age)  # 輸出: 30

init 被設(shè)置為 False,dataclass 不會(huì)自動(dòng)生成 init 方法
init 被設(shè)置為 True(即默認(rèn)),該方法接收兩個(gè)參數(shù) name 和 age,并將存儲(chǔ)在實(shí)例屬性 self.name 和 self.age 中

frozen控制是否創(chuàng)建一個(gè)凍結(jié)的數(shù)據(jù)類,即該類的實(shí)例在創(chuàng)建后就不可變
默認(rèn)情況下,dataclass 創(chuàng)建的類是可變的。
如果你想要?jiǎng)?chuàng)建一個(gè)不可變的類,可以設(shè)置 frozen=True:

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
p.x = 3  # 會(huì)引發(fā) AttributeError: can't set attribute
from dataclasses import dataclass, field, asdict

四、其它用法

field 支持的參數(shù)

參數(shù)描述默認(rèn)值
default字段的默認(rèn)值
default_factory返回字段初始值的函數(shù)
init是否在._init_()方法中使用字段True
repr是否在._repr_()方法中使用字段True
compare是否在比較對(duì)象時(shí), 包括該字段True
hash計(jì)算hash時(shí), 是否包括字段True
metadata包含字段信息的映射

compare 默認(rèn)指定比較,則各個(gè)屬性依次次進(jìn)行比較
注釋:下面僅用年齡進(jìn)行排序或者排序

@dataclass(order=True)
class Person:
    name: str = field(compare=False)
    age: int = field(compare=True)
    height: float = field(compare=False)

p1 = Person(name="A-zhangsan", age=25, height=156)
p2 = Person(name="B-lisi", age=18, height=173)
p3 = Person(name="C-wanger", age=20, height=168)

print(p2 > p1)  # 輸出 True
print(sorted([p1,p2, p3]))  # 輸出按薪資排序的 Person 對(duì)象列表
False
[
	Person(name='B-lisi', age=18, height=173), 
	Person(name='C-wanger', age=20, height=168), 
	Person(name='A-zhangsan', age=25, height=156)
]

控制字段初始化:使用 field() 函數(shù)可以更精細(xì)地控制字段的初始化:

from dataclasses import field

@dataclass
classPersonWithField:
    name:str= field(init=False)
    age:int
    city:str

def__post_init__(self):
        self.name =f"{self.age} year(s) old in {self.city}"

person_with_field =PersonWithField(age=30, city="New York")
print(person_with_field.name)  # 輸出: 30 year(s) old in New York

排除某些字段:如果你想在 repr() 方法中排除某些字段,可以使用 repr=False:

@dataclass(repr=False)
class PersonPartialRepr:
    name: str
    age: int = field(repr=False)
    city: str

partial_repr_person = PersonPartialRepr(name="Alice", age=30, city="New York")
print(partial_repr_person)  # 輸出: Person(name='Alice', city='New York')

五、使用場景舉例

數(shù)據(jù)記錄:dataclass 非常適合用來創(chuàng)建數(shù)據(jù)記錄類,尤其是在你需要存儲(chǔ)和處理結(jié)構(gòu)化數(shù)據(jù)時(shí)

@dataclass
class SalesRecord:
    product: str
    quantity: int
    price: float
    timestamp: str

record = SalesRecord(product="Widget", quantity=100, price=19.99, timestamp="2023-04-01T12:00:00")

配置文件:dataclass 也可以用來創(chuàng)建配置類,使得配置更加直觀和易于管理。

from typing importList

@dataclass
classConfig:
    database:str
    port:int
    debug:bool=False
    tables:List[str]= field(default_factory=list)

config =Config(database="mydb", port=5432, debug=True, tables=["users","products"])

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,dataclass 可以用來表示聚合根、實(shí)體和值對(duì)象。

@dataclass(frozen=True)
classUser:
	id:int
	username:str
	email:str

@dataclass
classUserBuilder:
	id:int=None
	username:str=None
	email:str=None

def build(self):
	if self.id is None or self.username is None or self.email is None:
		raiseValueError("All fields are required")
	returnUser(id=self.id, username=self.username, email=self.email)

數(shù)據(jù)驗(yàn)證:結(jié)合第三方庫如 Pydantic,dataclass 可以用于數(shù)據(jù)驗(yàn)證。

from pydantic import BaseModel

@dataclass
class UserInput(BaseModel):
    name: str
    age: int
    city: str

input_data = UserInput(name="Bob", age=25, city="Los Angeles")

到此這篇關(guān)于Python數(shù)據(jù)類dataclasses的具體使用的文章就介紹到這了,更多相關(guān)python dataclasses內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳談pandas中agg函數(shù)和apply函數(shù)的區(qū)別

    詳談pandas中agg函數(shù)和apply函數(shù)的區(qū)別

    下面小編就為大家分享一篇詳談pandas中agg函數(shù)和apply函數(shù)的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python線程之同步機(jī)制實(shí)際應(yīng)用場景舉例說明

    Python線程之同步機(jī)制實(shí)際應(yīng)用場景舉例說明

    這篇文章主要給大家分享的是Python線程之同步機(jī)制實(shí)際應(yīng)用場景舉例說明,銀行轉(zhuǎn)賬小栗子供大家參考學(xué)習(xí),希望對(duì)你有一定的幫助
    2022-02-02
  • Python 捕獲代碼中所有異常的方法

    Python 捕獲代碼中所有異常的方法

    這篇文章主要介紹了Python 捕獲代碼中所有異常的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • Python通過requests模塊實(shí)現(xiàn)抓取王者榮耀全套皮膚

    Python通過requests模塊實(shí)現(xiàn)抓取王者榮耀全套皮膚

    只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不如實(shí)踐帶來的提升快,只有在實(shí)例中才能獲得能力的提升,本篇文章手把手帶你用Python實(shí)現(xiàn)抓取王者榮耀全套皮膚,大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-10-10
  • django跳轉(zhuǎn)頁面?zhèn)鲄⒌膶?shí)現(xiàn)

    django跳轉(zhuǎn)頁面?zhèn)鲄⒌膶?shí)現(xiàn)

    這篇文章主要介紹了django跳轉(zhuǎn)頁面?zhèn)鲄⒌膶?shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python中操作MySQL和SQL Server數(shù)據(jù)庫的實(shí)戰(zhàn)指南

    Python中操作MySQL和SQL Server數(shù)據(jù)庫的實(shí)戰(zhàn)指南

    本文詳細(xì)介紹了如何在Pvthon中使用pymysql和pymssql庫進(jìn)行MySQL和SQLServer數(shù)據(jù)庫的基本操作,包括連接、查詢、插入、更新、異常處理、參數(shù)化查詢、ORM應(yīng)用、事務(wù)處理以及連接池的使用,為讀者提供了一套全面的數(shù)據(jù)庫操作指南,需要的朋友可以參考下
    2025-11-11
  • opencv 形態(tài)學(xué)變換(開運(yùn)算,閉運(yùn)算,梯度運(yùn)算)

    opencv 形態(tài)學(xué)變換(開運(yùn)算,閉運(yùn)算,梯度運(yùn)算)

    這篇文章主要介紹了opencv 形態(tài)學(xué)變換(開運(yùn)算,閉運(yùn)算,梯度運(yùn)算),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python+OpenCV實(shí)現(xiàn)分水嶺分割算法的示例代碼

    Python+OpenCV實(shí)現(xiàn)分水嶺分割算法的示例代碼

    分水嶺算法是用于分割的經(jīng)典算法,在提取圖像中粘連或重疊的對(duì)象時(shí)特別有用。本文將用Python+OpenCV實(shí)現(xiàn)這一算法,需要的可以參考一下
    2022-08-08
  • CentOS6.5設(shè)置Django開發(fā)環(huán)境

    CentOS6.5設(shè)置Django開發(fā)環(huán)境

    這篇文章主要為大家詳細(xì)介紹了CentOS6.5設(shè)置Django開發(fā)環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Python編程中NotImplementedError的使用方法

    Python編程中NotImplementedError的使用方法

    下面小編就為大家分享一篇Python編程中NotImplementedError的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04

最新評(píng)論

长白| 英吉沙县| 广东省| 炎陵县| 绩溪县| 玛多县| 汕尾市| 泾川县| 安龙县| 鄱阳县| 尉犁县| 吉水县| 广河县| 白银市| 天峨县| 水富县| 清河县| 双鸭山市| 蒙自县| 武功县| 北川| 克山县| 平果县| 莒南县| 黄大仙区| 达拉特旗| 开封市| 铅山县| 故城县| 治多县| 信宜市| 镇赉县| 新巴尔虎右旗| 宽甸| 商洛市| 汝南县| 保亭| 合川市| 饶平县| 法库县| 犍为县|