Jump to content

Construir uma classe


Adriana

Recommended Posts

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

  • 3 weeks later...

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?

  • Vote 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.