dataclasses 筆記

来源:https://www.cnblogs.com/zhuchunyu/archive/2020/05/14/12891679.html
-Advertisement-
Play Games

一、簡介 dataclasses是python新的內置庫,也是一種新的特性吧(對我來說吧,因為我很少用到) 具體內容官方文檔也有: 二、使用 在python中創建一個類,我們需要寫\_\_init\_\_方法進行初始化對象操作,需要對對象進一步說明的話,最好寫一個\_\_repr\_\_方法,這樣我 ...


一、簡介

dataclasses是python新的內置庫,也是一種新的特性吧(對我來說吧,因為我很少用到)

具體內容官方文檔也有:https://docs.python.org/3/library/dataclasses.html

二、使用

在python中創建一個類,我們需要寫__init__方法進行初始化對象操作,需要對對象進一步說明的話,最好寫一個__repr__方法,這樣我們直接輸出對象的話,方便理解這個對象是啥。寫兩三個這樣的類還好,多了的話,就覺得煩躁了,因為每寫個類,你都得需要寫__init__,__repr__這些方法,都是重覆性的操作。

class People:

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

    def __repr__(self):
        return f"Student-{self.name}"


# 實例一個name為zhuyu的People對象
zhuyu = People("zhuyu", 23)
print(zhuyu.name)  # 輸出 zhuyu
print(zhuyu)  # Student-zhuyu

下麵使用dataclasses去創建一個類,相對於上面這個類的寫法是不是顯得簡單很多,一些魔法方法不用我們自己去寫dataclasss會幫我們完成。

from dataclasses import dataclass


@dataclass  # 重點這裡
class Goods:
    """商品類"""
    name: str
    price: float


milk = Goods("milk", 9.99)
print(milk.name)  # milk
print(milk)       # Goods(name='milk', price=9.99)

dataclass會幫我們重寫一個魔法方法,可能是你想要的,也可能是你不想要的,我們可以通過一些參數進行控制(哪些魔法不想重寫),繼續看dataclass函數,它是可以傳參數的,它的註釋也寫得很清楚了

def dataclass(_cls=None, *, init=True, repr=True, eq=True, order=False,
              unsafe_hash=False, frozen=False):
    """Returns the same class as was passed in, with dunder methods
    added based on the fields defined in the class.

    Examines PEP 526 __annotations__ to determine fields.

    If init is true, an __init__() method is added to the class. If
    repr is true, a __repr__() method is added. If order is true, rich
    comparison dunder methods are added. If unsafe_hash is true, a
    __hash__() method function is added. If frozen is true, fields may
    not be assigned to after instance creation.
    """

    def wrap(cls):
        return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)

    # See if we're being called as @dataclass or @dataclass().
    if _cls is None:
        # We're called with parens.
        return wrap

    # We're called as @dataclass without parens.
    return wrap(_cls)

init參數預設為True,會預設幫你添加init方法,那麼你實例化該對象的話,就需要傳參數(如果需要參數傳遞話),為False的話,實例對象就不用傳遞了

..................具體實現效果可以寫個小demo,去看看就行

當然之前我們在寫類的時候,init方法中不單單隻是對屬性進行賦值,例如下麵這個demo

import uuid


def get_id():
    return str(uuid.uuid4())


class A:

    def __init__(self, name):
        self.name = name
        self.id = get_id()   # id不需要當作參數傳來
        self._init_config()  # 執行其他一些初始化操作

    def _init_config(self):
        """配置相關的操作"""
		print("執行初始化操作")
        print(self.name)


a = A("zhuyu")
print(a.id)

下麵我們通過dataclass來實現上面這個例子,通過重寫__post_init__這個方法,在這個方法中做一個邏輯操作,它執行完__init__方法之後就會調用__post_init__這個方法

from dataclasses import dataclass
import uuid


def get_id():
    return str(uuid.uuid4())


@dataclass
class A:
    name: str
    id: str = get_id()  # id 通過調用一個函數生成,就不用傳入了

    def _init_config(self):
        """配置相關的操作"""
        print("執行初始化操作")
        print(self.name)

    def __post_init__(self):
        self._init_config()


a = A("zhu")
print(a.id)

關於類的繼承,使用dataclass一樣也是可以繼承的

from dataclasses import dataclass


@dataclass
class A:
    name: str

    def __post_init__(self):
        print('父類')


@dataclass
class B(A):
    age: int

    def __post_init__(self):
        print('基類')
        super().__post_init__()


b = B('name', 22)

繼續看field,這個函數的位置為from dataclasses import field

def field(*, default=MISSING, default_factory=MISSING, init=True, repr=True,
          hash=None, compare=True, metadata=None):
    """Return an object to identify dataclass fields.

    default is the default value of the field.  default_factory is a
    0-argument function called to initialize a field's value.  If init
    is True, the field will be a parameter to the class's __init__()
    function.  If repr is True, the field will be included in the
    object's repr().  If hash is True, the field will be included in
    the object's hash().  If compare is True, the field will be used
    in comparison functions.  metadata, if specified, must be a
    mapping which is stored but not otherwise examined by dataclass.

    It is an error to specify both default and default_factory.
    """

    if default is not MISSING and default_factory is not MISSING:
        raise ValueError('cannot specify both default and default_factory')
    return Field(default, default_factory, init, repr, hash, compare,
                 metadata)

寫個demo看看這個怎麼使用

from dataclasses import field, dataclass


@dataclass
class A:
    name: str = field(default='zhuyu')


@dataclass
class B:
    name: str = field(init=True)


a = A()
b = B('zhuyu')
print(a.name)  # zhuyu
print(b.name)  # zhuyu

# init預設為true,說明你在初始化對象的時候,需要傳遞該參數(參考class B),但是field中從參數default 或者default_factory不為空的時候,就算init為true,也是可以不用傳遞參數(參考class A)
from dataclasses import field, dataclass


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


@dataclass
class B:
    name: str = field()
    age: int = field(repr=True)


a = A('zhuyu', 22)
b = B('zhuyu', 23)
print(a)  # A(name='zhuyu')
print(b)  # B(name='zhuyu', age=23)

# repr預設為True,會將該欄位添加到__repr__中去,為False的話,則不會添加進去

......... 其他的一些參數,可以寫一些demo看看顯示效果

三、完。

後面會經常使用這樣的寫法吧,多瞭解python的新特性還是挺不錯的,typing模塊我看很多第三方庫中也在經常使用,自己也要多學習學習。

參考文章:https://www.jianshu.com/p/22c07d6839ed


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先要知道換行符,如下: &#10 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div title="2020年5月14日&#10氣溫1 ...
  • # jQuery遍歷索引的方法 - 1.each() ```js $('li').each(function(index, ele){ $(ele).text(index).addClass('demo' + index); }); ``` - 2.children() ```js $('ul'). ...
  • 一、我們介紹幾個函數用於反編譯一個類​ package com.bjpowernode.java_learning; ​ public class D115_1_User { private String id; public int age; protected String addr; bool ...
  • 註:本筆記對應江灝老師在B站的教學視頻https://www.bilibili.com/video/BV1zE411V79p 1.1模塊 Python程式框架 將一個程式分割為源代碼文件的集合,以及將這些部分連接在一起的方法。 Python源代碼文件:*.py 一個py文件是一個模塊(moudle) ...
  • 一、Java概述 1、Java三大塊(三個不同的版本) Java的三個版本Java ME、Java SE、Java EE,並不是分隔的單獨的三大塊,從學習的角度來說,它們的關係類似於基礎、進階、高級,但也不完全是這個關係,通常學習都是先學習Java SE,然後再決定學習Java ME、Java EE ...
  • 告警信息: 13% building modules 28/40 modules 12 active ...dex=0!\src\App.vue{ parser: "babylon" } is deprecated; we now treat it as { parser: "babel" }. 9 ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 面試題66. 構建乘積數組 題目 給定一個數組 A[0,1,… ...
  • WebSocket跟常規的http協議的區別和優缺點這裡大概描述一下 一、websocket與http http協議是用在應用層的協議,他是基於tcp協議的,http協議建立鏈接也必須要有三次握手才能發送信息。http鏈接分為短鏈接,長鏈接,短鏈接是每次請求都要三次握手才能發送自己的信息。即每一個r ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...