Adriana Posted February 8, 2020 at 04:57 PM Report Share #617297 Posted February 8, 2020 at 04:57 PM Olá, Sou muito 'verde' em Python e estou a tentar resolver um exercício para o qual venho aqui pedir ajuda. Tenho que construir uma classe Time. Os atributos são hh e mm, que representam horas e minutos. A classe deve possuir: > Um construtor, def __init__(self,h,m):, com parâmetros que representam horas e minutos, por esta ordem. Deve originar uma excepção de tipo ValueError no caso de os seus valores não representarem um tempo válido (o valor da hora deve ser não negativo e os minutos devem estar entre 0 e 59). > Um método __str__, definido de modo que o output da instrução print(Time(2,3)) seja 2h03m. > Um método __lt__, de modo que seja possível comparar dois objectos de tipo Time, com o operador <; por exemplo, o output na consola para o input Time(1,59)<Time(2,0) deve ser True. > Um método __add__ que permita somar dois objectos de tipo Time. Por exemplo, o output da instrução print(Time(3,45)+Time(1,16)) deverá ser 5h01m. Construí o seguinte código em python 3.7. Está incompleto e não consegui usar o método __lt__e __add__ da maneira como está neste momento. Podem ajudar-me por favor? #construtor - alínea a) def __init__(self,h,m): self.hours=h self.minutes=m #__str__ - alínea b) def __str__(self): return str(self.hours)+"h"+str(self.minutes)+"m" #__lt__ - alínea c) def __lt__(self,other): if self.convert_to_minutes < other.convert_to_minutes: return True elif self>other: return False else: return "these events occur simultaneously" def convert_to_minutes(self): """converts Time object to an integer(# of minutes)""" minutes=self.hours*60+self.minutes return minutes #__add__ - alínea d) def __add__(self,other): import copy end_time=copy.deepcopy(self) minutes=self.convert_to_minutes()+other.convert_to_minutes() end_time.make_time(minutes) return end_time.__str__() def make_time(self,minutes): """converts from an integer to a Time object""" self.hours=minutes/60 minutes=minutes-self.hours*60 self.minutes=minutes Link to comment Share on other sites More sharing options...
pedropregueiro Posted February 23, 2020 at 10:49 PM Report Share #617420 Posted February 23, 2020 at 10:49 PM Olá @Adriana, O código que tens está quase correcto, só te faltaram alguns pequenos pormenores. Por exemplo, se correres o seguinte código: new_time = Time(2, 30) early_time = Time(1, 30) print(early_time < new_time) Receberás o seguinte erro: Traceback (most recent call last): File "78079.py", line 43, in <module> print(early_time < new_time) File "78079.py", line 20, in __lt__ if self.convert_to_minutes < other.convert_to_minutes: TypeError: '<' not supported between instances of 'method' and 'method' Como diz no erro, estás a tentar comparar os métodos em vez do resultado dos métodos. Quer dizer que só te esqueceste de adicionar os parêntesis () aos teus métodos. Em relação ao método __add__, tens de ver que quando divides os minutos por 60, vais receber um float com o resultado total da divisão, mas o que tu queres é o resultado da divisão inteira. Python tem um operador precisamente para isso 🙂. Em relação ao resto que dizes estar incompleto, o que não conseguiste fazer e porquê? Tens alguma dúvida em concreto em como resolver o resto? 1 Report Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now