Python 的 @dataclass 修饰符

作者: , 共 1326 字 , 共阅读 0

Python 提供很多语法糖,用起来非常方便。@dataclass 就是其中之一。

顾名思义,用它修饰的类是一个数据类,有点类似于 C++里的 plain struct ,会自动给类添加初始化__init____eq__等函数。比如类:

from dataclasses import dataclass

@dataclass
class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand

会自动添加下面的__init__初始化函数:

def __init__(self, name: str, unit_price: float, quantity_on_hand: int=0):
    self.name = name
    self.unit_price = unit_price
    self.quantity_on_hand = quantity_on_hand

如果在普通的初始化外还想自定义,可以自定义__post__init__函数,配合设置field(init=False)

from dataclasses import dataclass, field
@dataclass
class C:
    a: float
    b: float
    c: float = field(init=False)

    def __post_init__(self):
        self.c = self.a + self.b

C事实上自动添加了下面的初始化函数:

def __init__(self, a, b):
    self.a = a
    self.b = b
    self.__post__init()

还有一个有意思的东西是初始化。类成员直接用[]或者{}初始化,类似于函数的默认参数问题,将导致不同类共享同一个成员( Python 的一个大 bug !)。

from dataclasses import dataclass, field
@dataclass
class D:
    x: [] # 会引发问题,不同类共享同一个[]
    y: {} # 会引发问题,不同类共享同一个{}
    xx: field(default_factory=list) # ok
    yy: field(default_factory=dict) #ok

对于 dataclass ,dataclasses.as_tuple可以将类的成员依次取出,以 tuple 的方式返回。

Q. E. D.

类似文章:
Pyhon 的抽象基类( abstruct base class )库abc定义了类似于 C++的纯虚函数的功能:
编程 » Python, 并行计算
核心就是threading.Thread
相似度: 0.098
编程 » pytorch, C++
目前 pytorch 已经升级到了 1.7.0 ,但在 ubuntu 20.04 下有一个非常诡异的 bug。为此,我们只能自己编译。
相似度: 0.097
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径:
datetime 是 Python 的标准库:
编程 » Python
imp.load_source在动态载入 python 模块时非常有用,但需要注意其特性。
主要形式是下面三种。后面两种实际指向同一个位置(如果path是一个已存在的文件夹),但处理结果会有所差异。
编程 » C++, C++标准库
std::tuple的原理并不复杂,但有些细节非常有意思。其中有一个是至少在gnu C++ std的实现中,std::tuple是倒序存储的:
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
IT » Python, Ubuntu
主要是update-alternatives命令的使用。
纯景区路线,爬升约 600 米,路线长度约 8 公里。景区全台阶路线。夏天比较晒。
后一篇:
IT » talib, 技术分析
下面的安装地址可在https://github.com/mrjbq7/ta-lib#troubleshooting上找最新的: