Conținut curs
Python Avansat
Despre lecție

2.1 Introducere în metaclasses

  • Definirea conceptului de metaclassă și locul acestuia în ierarhia de clase din Python
    • Metaclasses sunt „clase pentru clase”, adică ele definesc cum sunt create, instanțiate și gestionate clasele în sine.
    • Metaclasses sunt un nivel mai sus în ierarhia de clase, având rolul de a crea și controla clasele (obiectele lor).
  • Explicarea diferenței dintre clase și metaclasses
    • Clasele definesc structura și comportamentul obiectelor (instanțele lor).
    • Metaclasses definesc structura și comportamentul claselor (obiectele lor).

2.2 Scopul și utilizarea metaclasselor

  • Prezentarea cazurilor de utilizare pentru metaclasses și cum acestea pot ajuta la crearea de cod mai ușor de înțeles și de întreținut
    • Validarea sau modificarea atributelor de clasă în timpul creării unei clase.
    • Implementarea unor pattern-uri de design, cum ar fi Singleton.
    • Automatizarea unor operații repetitive în definirea claselor (de exemplu, generarea metodelor specifice pentru toate clasele dintr-un pachet).
  • Discutarea câtorva exemple practice de utilizare a metaclasselor
    • Crearea de metaclass pentru a asigura că toate clasele dintr-un pachet au un prefix sau sufix comun.
    • Implementarea unui sistem de înregistrare a tuturor claselor definite într-un modul.

2.3 Metaclasses în Python: type și object

  • Explicarea funcției built-in type și rolul său în crearea de metaclasses și clase
    • type este metaclassa implicită pentru toate clasele în Python.
    • type poate fi utilizată pentru a crea metaclasses personalizate și clase, prin apelarea sa cu trei argumente: numele clasei, tuplul de clase de bază și dicționarul de atribute.
  • Introducerea clasei object și a relației sale cu metaclasses
    • Toate clasele din Python moștenesc implicit clasa object.
    • object este o instanță a metaclassă type.

Exemplu:

python
MyClass = type("MyClass", (object,), {"x": 10, "y": 20})
instance = MyClass()
print(instance.x)  # Output: 10

2.4 Crearea unei metaclass custom

  • Prezentarea pașilor pentru a crea o metaclassă custom în Python
    1. Extindeți metaclassa type.
    2. Suprascrieți metoda __new__ sau __init__ pentru a modifica comportamentul de creare a clasei.
  • Explicarea metodei __new__ și a rolului ei în crearea de metaclasses
    • Metoda __new__ este apelată în timpul creării unui obiect nou (înainte de __init__).
    • __new__ primește ca argumente metaclassa, numele clasei, tuplul de clase de bază și dicționarul de atribute.
    • __new__ poate fi suprascris pentru a modifica comportamentul de creare a clasei, de exemplu, pentru a adăuga sau modifica atributele clasei.
  • Implementarea unei exemple practice de metaclassă custom

Exemplu:

python
class PrefixMetaclass(type):
    def __new__(cls, name, bases, attrs):
        # Adaugă un prefix la toate atributele care nu încep cu '__'
        new_attrs = {("__" + k if not k.startswith("__") else k): v for k, v in attrs.items()}
        return super().__new__(cls, name, bases, new_attrs)

class MyClass(metaclass=PrefixMetaclass):
    x = 10

instance = MyClass()
print(instance.__x)  # Output: 10

2.5 Aplicarea metaclasselor custom

  • Prezentarea modului de utilizare a metaclasselor custom în definirea altor clase
    • Utilizați parametrul metaclass în definiția clasei pentru a specifica metaclassa custom.
    • Metaclassa custom va fi aplicată automat la toate clasele derivate din clasa de bază.
  • Exemplificarea aplicării unei metaclass custom la o clasă și verificarea efectelor sale

Exemplu:

python
class MyBaseClass(metaclass=PrefixMetaclass):
    base_attr = "base_value"

class DerivedClass(MyBaseClass):
    derived_attr = "derived_value"

instance = DerivedClass()
print(instance.__base_attr)  # Output: base_value
print(instance.__derived_attr)  # Output: derived_value

2.6 Exerciții și exemple practice

  • Exercițiu 1: Implementarea unei metaclass custom care să asigure că toate metodele unei clase au o descriere (docstring) înainte de a fi apelate.
  • Exercițiu 2: Crearea unei metaclass custom care să implementeze pattern-ul Singleton, asigurându-se că toate clasele care utilizează această metaclassă vor avea doar o singură instanță.
  • Exercițiu 3: Implementarea unei metaclass custom care să înregistreze automat toate clasele definite într-un modul într-un registru global, accesibil prin intermediul unei metode de clasă.
  • Exercițiu 4: Crearea unei metaclass custom care să valideze numele atributelor unei clase, asigurându-se că acestea respectă un anumit pattern, cum ar fi snake_case sau camelCase.

2.7 Încheiere și recapitulare

  • Recapitularea conceptelor și tehnicilor prezentate în această lecție
    • Metaclass: ce este și ce rol joacă în ierarhia de clase din Python
    • Scopul și utilizarea metaclasselor în dezvoltarea software
    • Crearea și aplicarea metaclasselor custom pentru a controla și extinde comportamentul claselor
  • Sublinierea importanței metaclasselor în înțelegerea avansată a limbajului Python
    • Metaclasses sunt un concept avansat, dar puternic în Python, care permit dezvoltatorilor să creeze cod mai ușor de înțeles, de întreținut și de extins.
    • Înțelegerea metaclasselor este esențială pentru aprofundarea cunoștințelor de Python și pentru a deveni un dezvoltator Python expert.