Méthodes de classe / statiques
Moyen
Il existe 3 types de méthodes:
- Les méthodes ordinaires qui prennent en argument l'instance de la classe dénotée self .
- Les méthodes de classe qui prennent en argument la classe dénotée cls . Elles sont utilisés pour créer des "factory functions" (fonctions qui créent d'autres objets). - Les méthodes statiques ne sont que de simples fonctions. Elle ne sont accessibles que par la classe. |
Méthodes de classe
2 manières de les utiliser:
- Soit pour mettre à jour une variable pour tous les objets (incluant la classe en elle même).
- Soit l'utiliser comme un constructeur alternatif.
Cas 1
class Employee:
#Variables de classe
raise_amount = 1.04
nb_employee = 0
#Constructeur
def __init__(self, firstname, lastname, pay):
#Attributs
self.firstname = firstname
self.lastname = lastname
self.email = firstname + '.' + lastname + '@company.com'
self.pay = pay
Employee.nb_employee += 1
#Méthodes
def fullname(self):
return self.firstname + ' ' + self.lastname
def apply_raise(self):
self.pay = int(self.pay * self.raise_amount)
#Méthodes de classe
@classmethod
def set_raise_amount(cls, amount):
cls.raise_amount = amount
emp_1 = Employee('ferdinand', 'mom', '50000')
print('Avant')
print(emp_1.raise_amount)
Employee.set_raise_amount(1.06)
print('Après')
print(Employee.raise_amount)
print(emp_1.raise_amount)
>>>
Avant
1.04
Après
1.06
1.06
Ainsi Employee.set_raise_amount(1.06) est équivalent à Employee.raise_amount = 1.06.
Cas 2
Supposons que nous avons des informations d'employé écrit de la manière suivante:
emp_str_1 = 'ferdinand-mom-60000'
emp_str_2 = 'test-user-50000'
Pour pouvoir le faire coincider avec notre moule, il faut tout d'abord:
- Retirez chaque trait d'union.
- Stockez chaque mots dans leurs variables respectives.
class Employee:
#Variables de classe
raise_amount = 1.04
nb_employee = 0
#Constructeur
def __init__(self, firstname, lastname, pay):
#Attributs
self.firstname = firstname
self.lastname = lastname
self.email = firstname + '.' + lastname + '@company.com'
self.pay = pay
Employee.nb_employee += 1
#Méthodes
def fullname(self):
return self.firstname + ' ' + self.lastname
def apply_raise(self):
self.pay = int(self.pay * self.raise_amount)
#Méthodes de classe
@classmethod
def set_raise_amount(cls, amount):
cls.raise_amount = amount
@classmethod
def from_string(cls, emp_str):
first, last, pay = emp_str.split('-') #On retire chaque trait d'union + On les stocke dans leurs variables
return cls(first, last, pay) #respectives
emp_str_1 = 'ferdinand-mom-60000'
new_emp_1 = Employee.from_string(emp_str_1)
print(new_emp_1.fullname())
print(new_emp_1.pay)
print(new
```python
>>>
ferdinand mom
60000
ferdinand.mom@company.com
Méthodes statiques
Les méthodes statiques ne sont que de simples fonctions. Elle ne sont accessibles que par la classe.
class Employee:
#Variables de classe
raise_amount = 1.04
nb_employee = 0
#Constructeur
def __init__(self, firstname, lastname, pay):
#Attributs
self.firstname = firstname
self.lastname = lastname
self.email = firstname + '.' + lastname + '@company.com'
self.pay = pay
Employee.nb_employee += 1
#Méthodes ordinaires
def fullname(self):
return self.firstname + ' ' + self.lastname
def apply_raise(self):
self.pay = int(self.pay * self.raise_amount)
#Méthodes de classe
@classmethod
def set_raise_amount(cls, amount):
cls.raise_amount = amount
@classmethod
def from_string(cls, emp_str):
first, last, pay = emp_str.split('-')
return cls(first, last, pay)
#Méthodes statiques
def is_adult(age):
if age > 18:
return age
emp_str_1 = 'ferdinand-mom-60000'
new_emp_1 = Employee.from_string(emp_str_1)
print("Test de is_adult() avec Employee:")
print(Employee.is_adult(20))
print("Test de is_adult() avec new_emp_1:")
print(new_emp_1.is_adult(20))
>>>
Test de is_adult() avec Employee:
20
Test de is_adult() avec new_emp_1:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-740dc202cb89> in <module>()
43 print(Employee.is_adult(20))
44 print("Test de is_adult() avec new_emp_1:")
---> 45 print(new_emp_1.is_adult(20))
TypeError: is_adult() takes 1 positional argument but 2 were given
Pour résumer:
- Les méthodes ordinaires prennent en argument l'instance de la classe dénotée self .
- Les méthodes de classe prennent en argument la classe dénotée cls . Elles sont utilisées: - Soit pour mettre à jour une variable pour tous les objets (incluant la classe en elle même). - Soit comme un constructeur alternatif. - Les méthodes statiques ne sont que de simples fonctions. Elle ne sont accessibles que par la classe. |