"Включение" сравнения для классов

Я хотел бы некоторую помощь на моем CSC HW. Он находится на классах / объектах, и это простой класс для определения круга с именем класса Circle(объект).

Точный текст HW (я закончил первые две части этого hw и, таким образом, эта третья часть является расширением начальной проблемы):

"" "Расширьте свой класс 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). Радиус: 4:000000"

Нам указали на определенную страницу нашего учебника с математическими операторами для классов: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 ответа

Решение

Определите или переопределите операторы сравнения для класса. http://docs.python.org/reference/expressions.html

Похоже, вы на правильном пути, за исключением того, что вам нужно только передать второй объект круга для сравнения. Я относится к первому объекту круга. Так что self.r даст вам первый круг. Также вам нужно вернуть True или False из метода.

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

Обратите внимание, что это просто сравнение r кругов.

Вы можете использовать декоратор total_ordering из functools, который генерирует все недостающие методы сравнения, если вы укажете eq () и один другой.

Учитывая класс, определяющий один или несколько методов упорядочения сравнительного сравнения, этот декоратор класса предоставляет остальное. Это упрощает усилия по определению всех возможных операций расширенного сравнения:

Класс должен определять один из lt (), le (), gt () или ge (). Кроме того, класс должен предоставлять метод eq ().

Это на самом деле не ответ на ваш вопрос, но обратите внимание, что ваш calcArea(...) метод как таковой не обязательно должен быть внутри класса. (Обратите внимание, что нет причин использовать self вообще в этом нет!)

На самом деле, то, что вы, вероятно, хотите, это метод, все еще внутри класса

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

так что он на самом деле использует радиус круга, в котором вы находитесь "в".

Краткий ответ: да. Вы должны определить операторы сравнения, которые хотите поддерживать, если только вы не унаследуете это поведение от базового класса.

Другие вопросы по тегам