Python中的数据类 |设置 2(装饰器参数)
先决条件: Python中的数据类 |设置 1
在这篇文章中,我们将讨论如何修改dataclass
模块虚拟为我们创建的默认构造函数。
dataclass()
装饰器——
@dataclasses.dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
通过更改这些参数的值,我们可以修改为我们的 DataClasses 制作的默认构造函数的行为和功能。
init:此参数指定是否应有默认构造函数。
True (default): There will be a default Constructor.
False : There won't be a default Constructor.
from dataclasses import dataclass
@dataclass(init = False)
class GfgArticle():
title: str
author: str
language: str
upvotes: int
# A DataClass object
article = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
TypeError: object() takes no parameters
repr :此参数指定 __repr__()函数的行为方式。假值对应于内存中对象的哈希值表示。真值对应于对象的 DataClass 表示。
from dataclasses import dataclass
@dataclass(repr = False)
class GfgArticle():
title: str
author: str
language: str
upvotes: int
# A DataClass object
article = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
print(article)
输出:
__main__.GfgArticle object at 0x7f391b7ddbe0
eq :此参数用于指定在使用==或!=运算符比较两个 DataClass 是否相等时执行的比较操作。 eq接受布尔值。
from dataclasses import dataclass
@dataclass(repr = False, eq = False)
class GfgArticle():
title: str
author: str
language: str
upvotes: int
# Two DataClass objects
dClassArticle1 = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
dClassArticle2 = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
equal = dClassArticle1 == dClassArticle2
print('Classes Equal:', equal)
输出:
__main__.GfgArticle object at 0x7ff501c63c18
__main__.GfgArticle object at 0x7ff501c63ba8
Classes Equal: False
当eq=False时,这两个对象使用它们的哈希值进行比较,基于它在内存中的位置,就像两个普通对象一样。由于两个对象具有不同的哈希表示,它们的相等性返回 False。
order :两个 DataClass 之间的比较不仅限于相等,还支持> , >= , <和<=运算符,当order=True设置在参数参数中时。
对象之间的比较是基于其对应属性之间的比较,从第一个开始逐个进行。
from dataclasses import dataclass
@dataclass(order = True)
class A():
var1: int
var2: str
var3: float
obj1 = A(1, "GeeksForGeeks", 7.0)
obj2 = A(2, "GeeksForGeeks", 7.0)
obj3 = A(1, "GfG", 7.0)
obj4 = A(1, "GeeksForGeeks", 8.0)
print(obj1 > obj2)
print(obj1 < obj3)
print(obj1 >= obj4)
输出:
False
True
False
freeze :这会将 DataClass 中的所有变量设置为一次性可初始化的,一旦初始化,就不能重新分配新值。 C++ 用户可以将其与const相关联, Java用户可以将其与final关键字相关联。
from dataclasses import dataclass
@dataclass(frozen = True)
class GfgArticle():
title: str
author: str
language: str
upvotes: int
dClassArticle = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
print(dClassArticle)
dClassArticle.upvotes = 100
print(dClassArticle)
GfgArticle(title=’DataClasses’, author=’vibhu4agarwal’, language=’Python’, upvotes=0)
Traceback (most recent call last):
File “dClass.py”, line 16, in
dClassArticle.upvotes = 100
File “
dataclasses.FrozenInstanceError: cannot assign to field ‘upvotes’
unsafe_hash :通常, Python中的可变对象是Unhashable 。这意味着它们的哈希不能使用Python的 hash()函数生成。
由于任何类对象(包括 DataClass 对象的值)都可以更改,因此它们是可变的。因此他们不应该能够产生任何散列值。
from dataclasses import dataclass
@dataclass
class GfgArticle():
title: str
author: str
language: str
upvotes: int
dClassArticle = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
print(dClassArticle)
print(hash(dClassArticle))
GfgArticle(title=’DataClasses’, author=’vibhu4agarwal’, language=’Python’, upvotes=0)
Traceback (most recent call last):
File “dClass.py”, line 15, in
print(hash(dClassArticle))
TypeError: unhashable type: ‘GfgArticle’
然而, frozen=True将变量设置为一次性可初始化,因此使对象不可变。这可以安全地为 DataClass 对象生成一个散列。
from dataclasses import dataclass
@dataclass(frozen = True)
class GfgArticle():
title: str
author: str
language: str
upvotes: int
dClassArticle = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
print(dClassArticle)
print(hash(dClassArticle))
输出:
GfgArticle(title=’DataClasses’, author=’vibhu4agarwal’, language=’Python’, upvotes=0)
9111021502060859577
unsafe_hash强制仍然可变的 DataClass 生成散列。
这种情况在逻辑上开始使用,我们知道一旦初始化,我们将不会更改 Dataclass 属性的值。但归根结底是他们可以改变的问题吗?或者换句话说, DataClass 是否没有被冻结?在使用unsafe_hash时,如果 DataClass 没有被冻结,那么 DataClass 会生成一个不安全的哈希,假设该类被冻结,然后程序员必须非常小心地进一步使用它。
from dataclasses import dataclass
@dataclass(unsafe_hash = True)
class GfgArticle():
title: str
author: str
language: str
upvotes: int
dClassArticle = GfgArticle("DataClasses",
"vibhu4agarwal",
"Python", 0)
print(dClassArticle)
print(hash(dClassArticle))
输出:
GfgArticle(title=’DataClasses’, author=’vibhu4agarwal’, language=’Python’, upvotes=0)
8924105619418522237