【问题标题】:What is the purpose of sort_index of a Dataclass in Python?Python中Dataclass的sort_index的目的是什么?
【发布时间】:2021-08-19 00:45:08
【问题描述】:

我正在学习数据类,但我对 sort_index 的用途及其实际工作方式感到困惑。

我似乎找不到任何有价值的信息。 Python 官方文档没有提到它,这令人难以置信。

这是一个例子:

@dataclass(order=True)
class Person:
    sort_index: int = field(init=False, repr=False)
    name: str
    age: int
    weight: int = 190
 
    def __post_init__(self):
        self.sort_index = self.weight

那么,sort_index 的目的是什么?这有什么用途?什么时候用?

再次感谢您花时间回答我的问题。我是 Python 新手。

【问题讨论】:

  • 官方 Python 文档没有提到它,原因与它没有提到 nameageweight 的原因相同。它是一个用户定义的字段。您需要查看 Person 类的文档,而不是 dataclass 的文档。

标签: python python-3.x python-dataclasses data-class


【解决方案1】:

__post_init__ 方法中设置sort_index 属性(或者实际上,任何 标识符—名称无关紧要)似乎是执行比较的值。强>

比较方法有一个隐式设置(__lt____gt__等——如果不熟悉,请阅读dunder方法),首先使用__post_init__方法中提供的属性,如果需要,其余的解析属性。

类构造函数

from dataclasses import dataclass, field

@dataclass(order=True)
class Person:
    sort_index: int = field(init=False)
    age: int
      
    
    def __post_init__(self):
        self.sort_index = self.age

第一个例子——属性age是相等的:

>>> p1 = Person(age=10)
>>> p2 = Person(age=10)
>>> p1 == p2
True

第二个例子——age 更大:

>>> p1 = Person(age=10)
>>> p2 = Person(age=20)
>>> p2 > p1
True

更复杂的例子

from dataclasses import dataclass, field

@dataclass(order=True)
class Person:
    foo: int = field(init=False, repr=False)
    bar: int = field(init=False, repr=False)
    name: str
    age: int
    weight: int = 190
    
    
    def __post_init__(self):
        self.foo = self.weight
        self.bar = self.age
        
>>> p1 = Person('p1', 10)
>>> p2 = Person('p1', 11)
>>> p2 > p2
True

原因
foo (weight) 对于两个实例来说是相等的,所以在 bar (age) 上进行比较

结论
比较可以任意复杂,标识符并不重要。

我强烈推荐 ArjanCodes 的 video on dataclasses
除了视频之外,这里还有一个指向example dataclass code 的 github 链接(来自同一视频)。

希望这会有所帮助——我自己刚刚了解了数据类。

【讨论】:

    猜你喜欢
    • 2022-10-07
    • 2021-12-22
    • 2017-05-04
    • 2021-08-09
    • 2016-06-30
    • 1970-01-01
    • 2012-02-21
    • 2012-12-17
    相关资源
    最近更新 更多