Python 在数据类中创建类变量的正确方法

Python 在数据类中创建类变量的正确方法,python,python-3.x,python-dataclasses,Python,Python 3.x,Python Dataclasses,我刚刚开始使用Python的数据类,我想确认我以正确的方式声明了类变量 使用常规python类 class Employee: raise_amount = .05 def __init__(self, fname, lname, pay): self.fname = fname self.lname = lname self.pay = pay @dataclass class Employee: fname: st

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

使用常规python类

class Employee:

    raise_amount = .05

    def __init__(self, fname, lname, pay):
        self.fname = fname
        self.lname = lname
        self.pay = pay
@dataclass
class Employee:
    fname: str
    lname: str
    pay: int
    raise_amount = .05
使用python数据类

class Employee:

    raise_amount = .05

    def __init__(self, fname, lname, pay):
        self.fname = fname
        self.lname = lname
        self.pay = pay
@dataclass
class Employee:
    fname: str
    lname: str
    pay: int
    raise_amount = .05
我指的类变量是
raise\u amount
。这是使用数据类正确声明的类变量吗?还是有更好的方法


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

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

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
字段被存储但未转换为属性


成员变量[…]是使用PEP 526类型注释定义的。

dataclass()
实际检查数据类型的两个位置之一 字段用于确定字段是否为PEP中定义的类变量 526它通过检查字段的类型是否为
typing.ClassVar
来实现这一点如果某个字段是
ClassVar
,则该字段将从 作为一个字段考虑,被数据类机制忽略。
此类
ClassVar
伪字段不由模块级返回 fields()函数


如果不想从exter访问它,可以在名称前添加两个下划线,如:“exter”是什么意思?我想要的是一个为Employee类的所有实例设置的通用变量。对于general类,它是,但对于dataclass不是!dataclass将创建有界属性如果您在任何方法中声明一个class属性并重写其值,则该属性仅对给定实例有界。(如果您在该实例上调用该方法),则使用模拟dataclass中的类变量是完全错误的方法,接受的
类型.ClassVar
要好得多。我最初的设置
提高金额=.05
似乎与
提高金额:ClassVar[float]=.05
具有相同的功能。如果缺少数据类型,您知道它是否会自动假定变量是类变量吗?不过,我很喜欢你的实现更加明确。如果一个变量没有注释,它将被
dataclass
完全忽略。这实际上也使它成为了一个类变量。明白了,有道理。非常感谢。我认为最好让事情变得显而易见,所以你的方法可能是最好的选择。非常感谢。