- 此问题在此处已有答案**:
Comparable classes in Python 3(5个答案)
三年前关闭了。
我想得到一些关于我的CSC硬件的帮助。它是关于类/对象的,它是一个定义圆的简单类,名为类Circle(对象)。
硬件的确切文本(我完成了本硬件的前两部分,因此第三部分是对初始问题的扩展):
"""通过使用〈、〉、〉=、〈=、==和!=等运算符启用Circle对象的比较来扩展Circle类,其中,如果一个Circle实际上比另一个Circle大(即面积更大),则认为它"大于"另一个Circle。
下面的代码:
A = Circle(2, 5, 1.5)
B = Circle(-6, 1, 1)
print A < B, A != B, A >= B
应生成以下输出:
False True True
这是我的代码显示坐标和半径的圆:
class Circle(object):
def __init__(self, x=0, y=0, r=0):
self.x = x
self.y = y
self.r = r
def __str__(self):
return "Circle at (%d , %d). Radius: %f" % (self.x, self.y, self.r)
def main():
print Circle(3, 5, 4.0)
main()
该类的输出为"在(3,5)处的圆。半径:四百万分之一"
我们被指向教科书中的某一页,上面有数学运算符:* * eq**(),gt(),ge(),lt(),le(),ne()等等。所以我在想,我的教授想要这样的东西吗?
import math
class Circle(object):
def __init__(self, x=0, y=0, r=0):
self.x = x
self.y = y
self.r = r
def __str__(self):
return "Circle at (%d , %d). Radius: %f" % (self.x, self.y, self.r)
def calcArea(self, r):
self.r = r
return (math.pi)*(r**2)
def __gt__(self, circ1Radius, circ2Radius)
self.circ1Radius = circ1Radius
self.circ2Radius = circ2Radius
r1 = circ1Radius
r2 = circ2Radius
r1 > r2 or r2 > r1
def __ge__(self, circ1Radius, circ2Radius)
#And so on for __lt__(), __le__(), __ne__(), etc
def main():
A = Circle(3,4,1.5)
B = Circle(1,2,5.0)
C = Circle(5,7,7)
D = Circle(9,8,3)
print A < B, B > C, A < C, A >= C
main()
#Output should be "True, False, True, False"
我们需要为类中使用的每个方法定义一个属性吗?先谢谢你。
4条答案
按热度按时间siv3szwd1#
您可以使用functools中的total_ordering装饰器,如果您提供
__eq__()
和另一个比较方法,它将生成所有缺少的比较方法。给定一个定义了一个或多个富比较排序方法的类,这个类装饰器提供了其余的方法,这简化了指定所有可能的富比较操作的工作:
该类必须定义
__lt__()
、__le__()
、__gt__()
或__ge__()
之一。此外,该类还应提供__eq__()
方法。例如,
sqxo8psd2#
定义或重写类的比较运算符。http://docs.python.org/reference/expressions.html#notin
看起来你的思路是对的,除了你只需要传递第二个圆对象给你的比较。self引用第一个圆对象。所以self.r会给予你第一个圆的r。你还需要从方法返回True或False。
请注意,这只是比较圆圈的r值。
u59ebvdq3#
简短回答:是的。除非从基类继承此行为,否则必须定义要支持的比较运算符。
kwvwclae4#
这实际上并不是对您的问题 * 本身 * 的回答,但是请注意,
calcArea(...)
方法实际上并不需要在类内部(请注意,根本没有理由在其中使用self
!)实际上,您可能需要的是仍在类内部的方法,类似于
这样它实际上使用了你“所在”的圆的半径。