python “启用”类别比较[重复]

pu82cl6c  于 2023-03-06  发布在  Python
关注(0)|答案(4)|浏览(113)
    • 此问题在此处已有答案**:

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"

我们需要为类中使用的每个方法定义一个属性吗?先谢谢你。

siv3szwd

siv3szwd1#

您可以使用functools中的total_ordering装饰器,如果您提供__eq__()和另一个比较方法,它将生成所有缺少的比较方法。
给定一个定义了一个或多个富比较排序方法的类,这个类装饰器提供了其余的方法,这简化了指定所有可能的富比较操作的工作:
该类必须定义__lt__()__le__()__gt__()__ge__()之一。此外,该类还应提供__eq__()方法。
例如,

import functools

@functools.total_ordering
class Student:
    def _is_valid_operand(self, other):
        return (hasattr(other, "lastname") and
                hasattr(other, "firstname"))

    def __eq__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))

    def __lt__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
sqxo8psd

sqxo8psd2#

定义或重写类的比较运算符。http://docs.python.org/reference/expressions.html#notin
看起来你的思路是对的,除了你只需要传递第二个圆对象给你的比较。self引用第一个圆对象。所以self.r会给予你第一个圆的r。你还需要从方法返回True或False。

def __gt__(self, circle2):
    return self.r > circle2.r

请注意,这只是比较圆圈的r值。

u59ebvdq

u59ebvdq3#

简短回答:是的。除非从基类继承此行为,否则必须定义要支持的比较运算符。

kwvwclae

kwvwclae4#

这实际上并不是对您的问题 * 本身 * 的回答,但是请注意,calcArea(...)方法实际上并不需要在类内部(请注意,根本没有理由在其中使用self!)
实际上,您可能需要的是仍在类内部的方法,类似于

def area(self):
   return math.pi*(self.r**2)

这样它实际上使用了你“所在”的圆的半径。

相关问题