Relógio

Relógio

Fácil

Instruções

Implementa um relógio que lida com horas, sem datas.

Deves conseguir adicionar e subtrair minutos ao relógio.

Dois relógios que representam a mesma hora devem ser iguais entre si.

Como este exercício é implementado no percurso Python

Os testes deste exercício esperam que o teu relógio seja implementado numa class Clock. Se não estás familiarizado com classes em Python, classes e classes (da documentação do Python) são bons pontos de partida.

Representar a tua classe

Quando trabalhas com objetos e os depuras, é importante teres uma boa representação desse objeto. Por exemplo, se criares um novo objeto datetime.datetime no ambiente REPL do Python, podes ver a sua representação em string:

>>> from datetime import datetime
>>> new_date = datetime(2022, 5, 4)
>>> new_date
datetime.datetime(2022, 5, 4, 0, 0)

A tua class Clock deve criar um object personalizado que trata de horas sem datas. Um aspeto importante desta class será a forma como é representada como string. Outros programadores que usem ou chamem objects Clock criados a partir da class Clock vão recorrer a esta representação em string para depurar e para outras atividades. No entanto, a representação predefinida de uma class personalizada não é muito útil:

>>> Clock(12, 34)
<Clock object st 0x102807b20 >

Para criares uma representação mais útil, podes definir um método especial __repr__ na class.

O ideal é que esse método __repr__ devolva código Python válido que possa ser usado para recriar o objeto quando passado a eval(), tal como está descrito na especificação de um método __repr__. Devolver código Python válido permite que outro programador copie e cole a str diretamente no código ou no REPL. Um Clock que representa as 11:30 da manhã podia ter este aspeto:

 `Clock(11, 30)`

Definir um método __repr__ é uma boa prática para todas as classes personalizadas. Há mais alguns aspetos a ter em conta:

  • A informação devolvida por este método deve ser útil ao depurar problemas.
  • Idealmente, o método devolve uma string que é código Python válido, embora isso nem sempre seja possível.
  • Se não for prático devolver código Python válido, a convenção é devolver uma descrição entre sinais de menor e maior: < ...a practical description... >.

Conversão para string

Para além do método __repr__, pode também haver necessidade de uma representação em string alternativa "legível para humanos" da class. Esta pode ser usada para formatar o objeto para a saída do programa ou para a documentação. Isto faz-se escrevendo um método especial __str__. Olhando novamente para datetime.datetime:

>>> str(datetime.datetime(2022, 5, 4))
'2022-05-04 00:00:00'

Quando se pede a um objeto datetime que se converta numa representação em string, este devolve uma str formatada de acordo com a norma ISO 8601, que a maioria das bibliotecas de datetime consegue interpretar como uma data e uma hora legíveis para humanos.

Neste exercício, vais ter a oportunidade de escrever um método __str__ para o teu Clock, bem como um método __repr__.

>>> str(Clock(11, 30))
'11:30'

Para suportar esta conversão para string, vais precisar de criar um método especial __str__ na tua class que devolva uma string mais "legível para humanos" com a hora do Clock.

Se não criares um método __str__ e chamares str() sobre a tua classe, o Python vai tentar chamar __repr__ sobre a tua classe como alternativa. Por isso, se implementares apenas um destes dois métodos especiais, é melhor criares um __repr__ do que apenas um __str__.


Fonte

Sessão de programação em par com Erin Drummond
Editar via GitHub A ligação abre numa nova janela ou separador
Python Exercism

Estás pronto para começar Relógio?

Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.