📜  Python中的数据类 |设置 2(装饰器参数)

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

Python中的数据类 |设置 2(装饰器参数)

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

在这篇文章中,我们将讨论如何修改dataclass模块虚拟为我们创建的默认构造函数。

dataclass()装饰器——

通过更改这些参数的值,我们可以修改为我们的 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)

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))

然而, 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))

输出:

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))

输出: