在Python中使用反向并集或交集运算符有什么区别吗?
例如,
s & z
对应于 s.__and__(z)
z & s
对应于 s.__rand__(z)
如果这些操作都应该返回相同的结果,为什么需要第一个操作符的反向版本呢?我有什么遗漏的吗?
在Python中使用反向并集或交集运算符有什么区别吗?
例如,
s & z
对应于 s.__and__(z)
z & s
对应于 s.__rand__(z)
如果这些操作都应该返回相同的结果,为什么需要第一个操作符的反向版本呢?我有什么遗漏的吗?
set
和 frozenset
遵循数字协议,它们没有明确定义反向操作,但是它们可以通过实现普通方法(如__and__
)来获得这些操作。
然而,当处理子类时,反向操作特别有用,因为如果右操作数是左操作数的子类,则首先尝试反向操作。 但是,在普通的set
和frozenset
中,这没有任何区别,因为它们彼此之间没有继承关系。
__add__
中返回NotImplemented
,则这些反向操作也会被使用。但是对于set
和frozenset
来说,这并不真正有用,因为它们只允许与其他set
类似的对象进行操作,并且至少当另一个操作数是另一个set
时,set
和frozenset
不会返回NotImplemented
。z & s
不对应于s.__rand__(z)
,除非s
是z
的子类。否则,在尝试s.__rand__(z)
之前,将尝试z.__and__(s)
。set
或frozenset
,并且这些类有不同的__and__
方法,那么就需要注意顺序和__rand__
方法的内容了吗? - MadPhysicistset
和frozenset
时,当你子类化其中一个并尝试与另一个进行操作时,需要注意顺序。如果你子类化了set
并实现了__and__
和__rand__
方法,当你尝试执行set() & subclass()
(=>首先调用subclass.__rand__
)或者subclass() & set()
(=>首先调用subclass.__and__
)时,将会首先调用你的子类方法。但是如果你尝试将这个子类与frozenset
一起使用,你需要注意顺序:frozenset() & subclass()
将首先调用frozenset.__and__
! - MSeifert__rand__
只有在左操作数不支持相应的操作且操作数类型不同时才会被调用。
我想 s.__rand__(z)
只是在底层调用 z.__and__(s)
。
__and__
方法的情况。 - juanpa.arrivillaga