Exercice 01 : Validateur de Date
Objectif
Cet exercice a pour but de vous faire utiliser des méthodes de classe et des méthodes statiques dans un contexte pratique : la création et la validation d'une classe Date.
Contexte
Vous allez créer une classe Date qui stocke un jour, un mois et une année.
- Le constructeur principal (
__init__) prendra le jour, le mois et l'année comme entiers. - Vous créerez un constructeur alternatif (une méthode de classe) pour créer une instance de
Dateà partir d'une chaîne de caractères au format "DD-MM-YYYY". - Vous ajouterez une méthode statique comme fonction utilitaire pour vérifier si une année est bissextile, car cette logique est liée aux dates mais n'a pas besoin d'une instance ou de la classe
Dateelle-même pour fonctionner.
Énoncé
-
Créez un nouveau fichier Python nommé
date_validator.py. -
Définissez la classe
Date.- Son constructeur
__init__doit accepterday,month, etyearet les stocker. - Implémentez la méthode
__str__pour qu'elle retourne la date au format "DD/MM/YYYY".
- Son constructeur
-
Créez une méthode statique
is_leap_year.- Décorez-la avec
@staticmethod. - Elle prend un seul argument,
year. - Elle doit retourner
Truesi l'année est bissextile,Falsesinon. - Rappel de la logique d'une année bissextile : une année est bissextile si elle est divisible par 4, sauf si elle est divisible par 100, à moins qu'elle ne soit également divisible par 400.
- Décorez-la avec
-
Créez une méthode de classe
from_string.- Décorez-la avec
@classmethod. - Elle prend deux arguments :
clsetdate_string. - Elle doit "parser" la
date_string(qui est au format "DD-MM-YYYY") pour en extraire le jour, le mois et l'année.- Astuce : Utilisez la méthode
.split('-')sur la chaîne.
- Astuce : Utilisez la méthode
- Elle doit convertir ces parties en entiers.
- Elle doit ensuite retourner une nouvelle instance de la classe en utilisant
cls(day, month, year).
- Décorez-la avec
-
Testez votre classe :
- Créez une instance de
Dateen utilisant le constructeur normal. - Créez une autre instance en utilisant la méthode de classe
from_string. - Affichez les deux dates pour vérifier que la méthode
__str__fonctionne. - Testez la méthode statique
is_leap_yearavec quelques années (ex: 2020, 2021, 1900, 2000).
- Créez une instance de
Résultat Attendu
Date 1: 25/12/2023
Date 2: 30/10/2024
Is 2020 a leap year? True
Is 2021 a leap year? False
Is 1900 a leap year? False
Is 2000 a leap year? True
Cliquez ici pour voir un exemple de code de solution
# date_validator.py
class Date:
def __init__(self, day, month, year):
self.day = day
self.month = month
self.year = year
def __str__(self):
return f"{self.day:02d}/{self.month:02d}/{self.year}"
@staticmethod
def is_leap_year(year):
"""Checks if a year is a leap year."""
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
@classmethod
def from_string(cls, date_string):
"""Creates a Date instance from a 'DD-MM-YYYY' string."""
day, month, year = map(int, date_string.split('-'))
return cls(day, month, year)
# --- Testing ---
# 1. Using the standard constructor
date1 = Date(25, 12, 2023)
print(f"Date 1: {date1}")
# 2. Using the class method as an alternative constructor
date_str = "30-10-2024"
date2 = Date.from_string(date_str)
print(f"Date 2: {date2}")
# 3. Using the static method
print(f"Is 2020 a leap year? {Date.is_leap_year(2020)}")
print(f"Is 2021 a leap year? {Date.is_leap_year(2021)}")
print(f"Is 1900 a leap year? {Date.is_leap_year(1900)}")
print(f"Is 2000 a leap year? {Date.is_le_year(2000)}")