2012-01-08 3 views
0

Я построил новый класс в Python, который определяет время с 6 цифр (например, 18:45:00)Сравнение экземпляров классов в Python

class Time(object): 

    def __init__(self, hour, minute, second): 
     minute = minute + second/60 
     hour = hour + minute/60   
     self.hour = hour % 24 
     self.minute = minute % 60 
     self.second = second % 60 

Я также определил много методов, чтобы заставить его работать как надо , проблема у меня есть с помощью метода КСС:

def __cmp__(self,other): 
    return cmp(self.to_seconds(),other.to_seconds()) 

Он отлично работает, когда я пытаюсь сравнить время, если я сортировка списка раз он также отлично работает. Но если я пытаюсь сортировать список раз и целые числа или строки, это также работает. Как я могу определить его, чтобы сравнивать только времена и поднимать и ошибки, если пытаться сравнить время с чем-то, что нет.

+1

Не то, что мы не все нравится изобретать колесо времени от времени, но почему бы не использовать питон 'datetime'? У этого уже есть эта функциональность, и SO MUCH MORE (TM)! – Nate

+0

@Nate, посмотрите на тег 'homework' :) – reclosedev

ответ

4

Вы можете использовать isinstance(), чтобы увидеть, если аргумент является экземпляром некоторого класса. См. documentation.

3

Вам необходимо выполнить проверку типа в __cmp__, затем действовать соответствующим образом.

Например, может быть что-то вроде этого:

import numbers 

def __cmp__(self, other): 
    other_seconds = None 
    if hasattr(other, "to_seconds"): 
     other_seconds = other.to_seconds() 
    elif isinstance(other, numbers.Real): 
     other_seconds = other 

    if seconds is None: 
     return NotImplemented 

    return cmp(self.to_seconds(), seconds) 
+0

Должен быть TypeError, IMO. И 'if other_seconds is None' – warvariuc

+0

D'oh - да, он должен (для других: заметить, что' 'x" + 3' вызывает 'TypeError'). –

+0

Но, на самом деле, это должно быть 'NotImplemented' (ответ Элмера) –

3
def __cmp__(self, other): 
    if not isinstance(other, Time): 
    return NotImplemented 
    return cmp(self.to_seconds(), other.to_seconds()) 

NotImplemented константа для возврата для неопределенных действий сравнения: http://docs.python.org/library/constants.html

Смежные вопросы