Python 在数据类中创建类变量的正确方法
我刚刚开始使用Python的数据类,我想确认我以正确的方式声明了类变量 使用常规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
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
完全忽略。这实际上也使它成为了一个类变量。明白了,有道理。非常感谢。我认为最好让事情变得显而易见,所以你的方法可能是最好的选择。非常感谢。