用于比较的魔法方法
python 提供了一系列的魔法方法去实现两个对象间直接的比较而不需要去调用方法.
python 也提供了去更改python 默认的比较行为.
1. __cmp__(self, other)
__cmp__
是所有比较魔法方法中最基础的一个,它实际上定义了所有比较操作符的行为(<,==,!=
,等等),但是它可能不能按照你需要的方式工作(例如,判断一个实例和另一个实例是否相等采用一套标准,而与判断一个实例是否大于另一实例采用另一套)。
__cmp__
应该在 self < other
时返回一个负整数,
在 self == other
时返回0
,
在 self > other
时返回正整数。
最好只定义你所需要的比较形式,而不是一次定义全部。 如果你需要实现所有的比较形式,而且它们的判断标准类似,那么 __cmp__
是一个很好的方法,可以减少代码重复,让代码更简洁。
2. __eq__(self, other)
定义等于操作符(==
)的行为.(equal)
3. __ne__(self, other)
定义不等于操作符(!=
)的行为.
4. __lt__(self, other)
定义小于操作符(<
)的行为.(less than)
5. __gt__(self, other)
定义大于操作符(>
)的行为.(great than)
6. __le__(self, other)
定义小于等于(<=
)操作符.(less or equal)
7. __ge__(self, other)
定义大于等于(>=
)操作符.(great than)
举个例子:
假如我们想用一个类来存储单词。我们可能想按照字典序(字母顺序)来比较单词,字符串的默认比较行为就是这样。我们可能也想按照其他规则来比较字符串,像是长度,或者音节的数量。
在这个例子中,我们使用长度作为比较标准,下面是一种实现:
class Word(str):
"""单词类,按照单词长度来定义比较行为"""
def __new__(cls, word):
# 注意,我们只能使用 __new__ ,因为str是不可变类型
# 所以我们必须提前初始化它(在实例创建时)
if ' ' in word:
print("Value contains spaces. Truncating to first space.")
word = word[:word.index(' ')]
# Word现在包含第一个空格前的所有字母
return str.__new__(cls, word)
def __gt__(self, other):
print("gt...")
return len(self) > len(other)
def __lt__(self, other):
print("lt...")
return len(self) < len(other)
def __ge__(self, other):
print("ge...")
return len(self) >= len(other)
def __le__(self, other):
print("le...")
return len(self) <= len(other)
#创建两个 Word 对象
w1 = Word("bcd")
w2 = Word("z")
print("w1 < w2:", w1 < w2)
print("w1 > w2:", w1 > w2)
print("w1 <= w2:", w1 <= w2)
print("w1 >= w2:", w1 >= w2)