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
今天写一段程序时遇到一个问题,查了好一会才搞清楚。代码可以简化为下面这个小代码:
编程 » Python
在 Python 中,有时候为了获取当前运行的脚本的同目录下的另外一个文件,会这么写:
相似度: 0.089
编程 » pytorch, C++
目前 pytorch 已经升级到了 1.7.0 ,但在 ubuntu 20.04 下有一个非常诡异的 bug。为此,我们只能自己编译。
编程 » Python, 并行计算
核心就是threading.Thread
命令行参数的初步说明,请参考argparse 模块用法实例详解,写的很清晰而详细。
datetime 是 Python 的标准库:
Python的命令行包argparse内置了-h, --help命令。但它没有分组,和其它的命令混在一起,并且显示在最前面。我更喜欢把它放在单独的「LOG 和帮助」分组:
编程 » Python
imp.load_source在动态载入 python 模块时非常有用,但需要注意其特性。
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径:
纯景区路线,爬升约 600 米,路线长度约 8 公里。景区全台阶路线。夏天比较晒。
后一篇:
IT » talib, 技术分析
下面的安装地址可在https://github.com/mrjbq7/ta-lib#troubleshooting上找最新的: