Python中的数据类 |设置 3(数据类字段)
先决条件: Python Set 1 中的数据类 |设置 2
在这篇文章中,我们将讨论如何修改 DataClass 对象属性的某些属性,而无需使用field
函数为其显式编写代码。
field()
函数-
dataclasses.field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None)
MISSING
值是一个标记对象,用于检测是否提供了default
和default_factory
参数。使用此标记是因为None
是default
的有效值。任何代码都不应直接使用MISSING
值。
default:此参数指定属性的默认值,如果在对象创建期间没有提供值。与函数中的参数类似,具有默认值的字段必须位于没有默认值的字段之后。
还有一种提供默认值的替代方法——就像使用=运算符对普通变量所做的那样。 (下面代码中的第 9 行)
from dataclasses import dataclass, field
@dataclass
class GfgArticle:
title: str
author: str
language: str = field(default ='Python3')
upvotes: int = 0
# A DataClass object
article = GfgArticle("DataClass", "vibhu4agarwal")
print(article)
输出:
GfgArticle(title='DataClass', author='vibhu4agarwal', language='Python3', upvotes=0)
default_factory :如果提供,它必须是一个零参数的可调用对象,当该字段需要默认值时将调用它。
可调用的返回值将被设置为对象创建中属性的默认值。
您可以为默认工厂提供可调用对象,也可以为属性提供默认值。同时指定default和default_factory是错误的。
from dataclasses import dataclass, field
from random import choice
def get_default_language():
languages = ['Python3', 'Java', "CPP"]
return choice(languages)
@dataclass
class GfgArticle:
title: str
author: str
language: str = field(default_factory = get_default_language)
upvotes: int = 0
# A DataClass object
article = GfgArticle("DataClass", "vibhu4agarwal")
print(article)
上面的代码在创建 DataClass 对象时将 Python3、 Java或 CPP 之一作为语言的默认值。
init 、 repr和hash参数类似于上一篇文章中讨论的 dataclass函数中的参数。 compare参数可以与 dataclass函数中的order相关。不同之处在于它们仅适用于特定属性的能力,而不适用于装饰器下 DataClass 中的所有属性。
init :如果为 true(默认值),则此字段作为参数包含在生成的 __init__() 方法中。当init
设置为False
时,应提供一种设置默认值的方法。
repr :如果为 true(默认值),则此字段包含在生成的 __repr__() 方法返回的字符串中。
compare :如果为 true(默认值),则此字段包含在生成的相等和比较方法(__eq__()、__gt__() 等)中。
from dataclasses import dataclass, field
@dataclass
class GfgArticle:
title: str = field(compare = False)
author: str = field(repr = False)
language: str = field(default ='Python3')
upvotes: int = field(init = False, default = 0)
# DataClass objects
# Note the difference in their title value
article1 = GfgArticle("DataClass", "vibhu4agarwal")
article2 = GfgArticle("Python Packaging", "vibhu4agarwal")
print(article1)
print(article1.author)
print(article1 == article2)
输出:
GfgArticle(title='DataClass', language='Python3', upvotes=0)
vibhu4agarwal
True
hash :这可以是bool
或None
。如果为 true,则此字段包含在生成的 __hash__() 方法中。如果None
(默认值),使用compare
的值:这通常是预期的行为。
如果某个字段用于比较,则应在哈希中考虑该字段。不鼓励将此值设置为None
以外的任何值。
metadata :这通常是一个字典,表示各种信息的键值对及其数据。
这个特定属性在大多数情况下似乎并没有真正使用,但是如果您的 DataClass 在开发过程中的某个地方实际上正在使用,并且当第三方的工具或软件集成到项目。
在脚本中,可以通过查询对象的__dataclass_fields__变量来访问它的值。
from dataclasses import dataclass, field
@dataclass
class GfgArticle:
title: str = field(compare = False)
author: str = field(metadata ={'data': 'Profile Handle'})
language: str = field(default ='Python3')
upvotes: int = field(init = False, default = 0)
# A DataClass object
article = GfgArticle("DataClass", "vibhu4agarwal")
print(article)
print(article.__dataclass_fields__['author'].metadata)
输出:
GfgArticle(title='DataClass', author='vibhu4agarwal', language='Python3', upvotes=0)
{'data': 'Profile Handle'}