重载 __eq__ 方法以返回自定义对象
重载 __eq__ 方法以返回自定义对象
我正在用Python编写一种DSL,并且我想要重载运算符,以便能够更轻松地编写我的DSL表达式。例如,我想要写Var(\"a\") + Var(\"b\")
并获得等价的表示Add(Var(\"a\"), Var(\"b\"))
。为此,我重载了__add__
方法,并且对于这个例子它工作得很好。\n然而,我尝试重载__eq__
方法以实现类似的效果:我想要写Var(\"a\") == Var(\"b\")
并获得等价的表示Eq(Var(\"a\"), Var(\"b\"))
。通过重载__eq__
方法,返回Eq
的实例,我实现了我的目标。但是当重载__eq__
方法时,它显然会干扰Python的标准行为,比如Var(\"b\") in [Var(\"a\")]
返回True
。\n是否有一种方法可以实现我的目标,即能够写Var(\"a\") == Var(\"b\")
并获得Eq(Var(\"a\"), Var(\"b\"))
,但仍然能够写if Var(\"a\") == Var(\"b\"): blablabla
或将表达式放入内置容器中等等?
无法同时实现两种行为,需要选择其中一种。无法可靠地检测到使用.__eq__()
方法的上下文。
如果需要同时使用两种行为,则需要使用不同的运算符或方法来表示DSL行为。
问题的原因是在使用.__eq__()
方法时无法可靠地检测到其上下文。因此,无法同时实现两种不同的行为。如果需要同时实现两种行为,则需要使用其他运算符或方法来表示DSL(领域特定语言)的行为。
解决方法是选择一种行为而放弃另一种行为。由于无法可靠地检测到.__eq__()
方法的上下文,因此需要使用其他方式来表示所需的行为。可以考虑使用不同的运算符或方法来实现DSL行为,以满足不同的需求。
总结起来,由于无法可靠地检测到.__eq__()
方法的上下文,无法同时实现两种不同的行为。因此,需要选择一种行为并使用其他运算符或方法来表示所需的行为。这样可以在满足需求的同时避免出现问题。