我刚刚开始使用Python的数据类,我想确认我是以正确的方式声明类变量的.

Using regular python classes

class Employee:

    raise_amount = .05

    def __init__(self, fname, lname, pay):
        self.fname = fname
        self.lname = lname
        self.pay = pay

Using python Data Class

@dataclass
class Employee:
    fname: str
    lname: str
    pay: int
    raise_amount = .05

我指的类变量是raise_amount.这是使用数据类正确声明的类变量吗?还是有更好的方法?

我已经测试了数据类实现,它提供了预期的功能,但我主要想知道我的实现是否遵循了最佳实践.

推荐答案

要创建类变量,请将字段注释为typing.ClassVar或根本不注释.

from typing import ClassVar

@dataclass
class Foo:
    ivar: float = 0.5
    cvar: ClassVar[float] = 0.5
    nvar = 0.5

foo = Foo()
Foo.ivar, Foo.cvar, Foo.nvar = 1, 1, 1
print(Foo().ivar, Foo().cvar, Foo().nvar)   # 0.5 1 1
print(foo.ivar, foo.cvar, foo.nvar)         # 0.5 1 1

有一个微妙的区别是,@dataclass完全忽略了未注字段,而ClassVar字段被存储,但没有转换为属性.


dataclasses — Data Classes

The member variables [...] are defined using PEP 526 type annotations.

类变量

dataclass()实际判断a类型的两个地方之一

Python-3.x相关问答推荐

当索引大于一个整数而小于前一个索引时,我如何返回列值?

如何将python点击参数设置为与选项回调不同的参数的别名?

Python-Django 设置 Pandas DataFrame 的多索引不会分组/合并最后一个索引

SQL Server 2022和Python3.10脚本错误

为什么不能用格式字符串 '-' 绘制点?

在 python 中使用正则表达式在行尾查找特定元素

如何在 histplot 中标记核密度估计

Django - ValueError:无法将字符串转换为浮点数:''

如何在 20 秒后重复使用 Pillow 在现有图像上创建新图像?

解包时是否可以指定默认值?

在气流中运行 DAG 时出现处理信号:ttou消息

如何通过命令行将数组传递给python

如何在元素列表中找到最大的数字,可能是非唯一的?

在计算之前删除包含某些值的组合

通过多个键对字典列表进行分组和聚合

Python中的多行日志(log)记录

我可以替换 Python 中对象的现有方法吗?

python asyncio add_done_callback 与 async def

如何阻止散景在 Jupyter Notebook 中打开新标签?

有没有办法在多个线程中使用 asyncio.Queue ?