如何使用 dunder 方法进行对象比较
How to use dunder methods for object comparison
使用双下划线方法比较两个对象
我试图比较两个 'Time objects',但我得到了这个错误:
'TypeError: '<' not supported between instances of 'Time' and 'Time'
这是我试过的:
- 我首先初始化了'time Class'。
class Time:
def __init__(self, h, m, s):
self._h = h
self._m = m
self._s = s
# Read-only field accessors
@property
def hours(self):
return self._h
@property
def minutes(self):
return self._m
@property
def seconds(self):
return self._s
- 我创建了一个方法来比较两个 Time 对象。
def _cmp(time1, time2):
if time1._h < time2._h:
return 1
if time1._h > time2._h:
return -1
if time1._m < time2._m:
return 1
if time1._m > time2._m:
return -1
if time1._s < time2._s:
return 1
if time1._s > time2._s:
return -1
else:
return 0
- 我创建了 dunder 方法。
def __eq__(self, other):
return True if _cmp(self, other) == 0 else False
def __lt__(self, other):
return True if _cmp(self, other) == 1 else False
def __le__(self, other):
return True if _cmp(self, other) == 1 or _cmp(self, other) == 0 else False
- 我实例化了一些对象,并尝试比较它们(导致错误)。
t1 = Time(13, 10, 5)
t2 = Time(5, 15, 30)
print(t1 < t2)
print(t2 <= t1)
我肯定漏掉了什么。欢迎所有编码技巧!
有很多dunder-methods(或magic-methods),如果你想使用<
和<=
那么你想使用
__lt__
for <
and __le__
for <=
(代表小于和小于等于)
class A:
def __init__(self, n):
self.n = n
def __le__(self, other):
return self.n <= other.n
a = A(5)
b = A(10)
print(a <= b)
将 return 正确,因为 5 小于或等于 10。
正如 Matthias 和 Jonathan 所建议的,我忘记缩进以下代码并将其放在我的时间之外 class:
def __eq__(self, other):
return True if _cmp(self, other) == 0 else False
def __lt__(self, other):
return True if _cmp(self, other) == 1 else False
def __le__(self, other):
return True if _cmp(self, other) == 1 or _cmp(self, other) == 0 else False
使用双下划线方法比较两个对象
我试图比较两个 'Time objects',但我得到了这个错误:
'TypeError: '<' not supported between instances of 'Time' and 'Time'
这是我试过的:
- 我首先初始化了'time Class'。
class Time:
def __init__(self, h, m, s):
self._h = h
self._m = m
self._s = s
# Read-only field accessors
@property
def hours(self):
return self._h
@property
def minutes(self):
return self._m
@property
def seconds(self):
return self._s
- 我创建了一个方法来比较两个 Time 对象。
def _cmp(time1, time2):
if time1._h < time2._h:
return 1
if time1._h > time2._h:
return -1
if time1._m < time2._m:
return 1
if time1._m > time2._m:
return -1
if time1._s < time2._s:
return 1
if time1._s > time2._s:
return -1
else:
return 0
- 我创建了 dunder 方法。
def __eq__(self, other):
return True if _cmp(self, other) == 0 else False
def __lt__(self, other):
return True if _cmp(self, other) == 1 else False
def __le__(self, other):
return True if _cmp(self, other) == 1 or _cmp(self, other) == 0 else False
- 我实例化了一些对象,并尝试比较它们(导致错误)。
t1 = Time(13, 10, 5)
t2 = Time(5, 15, 30)
print(t1 < t2)
print(t2 <= t1)
我肯定漏掉了什么。欢迎所有编码技巧!
有很多dunder-methods(或magic-methods),如果你想使用<
和<=
那么你想使用
__lt__
for <
and __le__
for <=
(代表小于和小于等于)
class A:
def __init__(self, n):
self.n = n
def __le__(self, other):
return self.n <= other.n
a = A(5)
b = A(10)
print(a <= b)
将 return 正确,因为 5 小于或等于 10。
正如 Matthias 和 Jonathan 所建议的,我忘记缩进以下代码并将其放在我的时间之外 class:
def __eq__(self, other):
return True if _cmp(self, other) == 0 else False
def __lt__(self, other):
return True if _cmp(self, other) == 1 else False
def __le__(self, other):
return True if _cmp(self, other) == 1 or _cmp(self, other) == 0 else False