我在 python 中创建了一个数据类,选择使用隐式定义的
__init__
方法。然后,我尝试显式重写比较 dunder 方法之一 (
__eq__
)。因为没有明确的
__init__
方法,所以'this'参数不存在,所以python抛出了一个NameError。为了做到这一点,即使自动生成的很好,我是否也必须编写一个显式的
__init__
?
你没有必要写一个显式的
__init__
方法到你的数据类中,即使你定义了像
__eq__
这样的 dunder 方法。Python 数据类足够聪明,能够处理这种情况。你可能在
__eq__
方法的实现中遇到了错误。
当你在数据类中定义
__eq__
方法时,你应该使用
self
来引用当前实例,而不是
this
。
这是一个如何做到的例子:
from dataclasses import dataclass
@dataclass
class MyClass:
data: int
def __eq__(self, other):
if isinstance(other, MyClass):
return self.data == other.data
return False
在这个例子中:
-
我们使用
dataclasses
模块中的@dataclass
装饰器来定义一个数据类。 -
MyClass
数据类有一个属性data
。 -
我们显式定义了
__eq__
方法来比较两个MyClass
实例,基于它们的值是否相等。注意我们是如何使用self
来引用当前实例的。
通过这种实现,你应该能够在没有显式
__init__
方法的情况下比较你的数据类的实例。
如果你仍然遇到
NameError
,请提供你的代码片段,以便我可以帮助你进一步调试。