📜  Python中的数据类 |设置 3(数据类字段)

📅  最后修改于: 2022-05-13 01:55:34.878000             🧑  作者: Mango

Python中的数据类 |设置 3(数据类字段)

先决条件: Python Set 1 中的数据类 |设置 2

在这篇文章中,我们将讨论如何修改 DataClass 对象属性的某些属性,而无需使用field函数为其显式编写代码。

field()函数-

MISSING值是一个标记对象,用于检测是否提供了defaultdefault_factory参数。使用此标记是因为Nonedefault的有效值。任何代码都不应直接使用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 :如果提供,它必须是一个零参数的可调用对象,当该字段需要默认值时将调用它。
可调用的返回值将被设置为对象创建中属性的默认值。
您可以为默认工厂提供可调用对象,也可以为属性提供默认值。同时指定defaultdefault_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 之一作为语言的默认值。

initreprhash参数类似于上一篇文章中讨论的 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 :这可以是boolNone 。如果为 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'}