Conținut curs
Python Avansat
Despre lecție
  1. Introducere în metaprogramare

    • Definiția metaprogramării și aplicațiile sale
    • Domenii în care metaprogramarea poate fi utilă
  2. Funcții și clase dinamice

    • Crearea de funcții dinamice cu exec și eval
    • Crearea de clase dinamice cu type
    • Avantajele și dezavantajele utilizării codului dinamic
  3. Decoratori în Python

    • Introducere și utilizare a decoratorilor
    • Crearea de decoratori simpli
    • Decoratori cu argumente
    • Decoratori pentru clase și metode
  4. Metaclasses în Python

    • Conceptul de metaclass și rolul său în Python
    • Crearea de metaclasses personalizate
    • Utilizarea metaclasses pentru a personaliza procesul de creare a claselor
  5. Introspecție și reflecție în Python

    • Introducere în introspecție și reflecție
    • Utilizarea modulului inspect pentru a examina obiectele dinamic
    • Modificarea obiectelor în timpul rulării cu ajutorul reflecției
  6. Recapitulare și bune practici

    • Rezumatul lecției și a tehnicilor prezentate
    • Bune practici pentru metaprogramare și cod dinamic

Exemple și exerciții pentru fiecare subpunct:

Exemplu: Crearea de funcții dinamice cu exec și eval

python
cod_sursa = '''
def salut(nume):
    return f"Salut, {nume}!"
'''

exec(cod_sursa)

rezultat = salut("Mihai")
print(rezultat)

Exercițiu:

Scrieți un program care să creeze dinamic o funcție care calculează suma a două numere.

Exemplu: Crearea unei clase dinamice cu type

python
def init(self, nume):
    self.nume = nume

def salut(self):
    return f"Salut, {self.nume}!"

Persoana = type("Persoana", (object,), {"__init__": init, "salut": salut})

p = Persoana("Ana")
print(p.salut())

Exercițiu:

Creați dinamic o clasă Cerc care să conțină un atribut raza și o metodă pentru a calcula aria cercului.

Exemplu: Crearea unui decorator simplu

python
def afiseaza_mesaj(functie):
    def wrapper():
        print("Se execută funcția...")
        functie()
        print("Funcția s-a executat.")
    return wrapper

@afiseaza_mesaj
def salut():
    print("Salut!")

salut()

Exercițiu:

Creați un decorator care să cronometreze timpul de execuție al unei funcții.

Exemplu: Utilizarea metaclasselor pentru a personaliza procesul de creare a claselor

python
class Meta(type):
    def __new__(mcs, nume, baze, atrib):
        print(f"Crearea clasei {nume} cu metaclass {mcs.__name__}")
        return super().__new__(mcs, nume, baze, atrib)

class Exemplu(metaclass=Meta):
    pass

Exercițiu:

Creați o metaclassă care să adauge automat o metodă salut tuturor claselor create cu aceasta.

Rezumat:

În această lecție, am explorat conceptul de metaprogramare și am învățat cum să lucrăm cu cod dinamic în Python. Am discutat despre crearea de funcții și clase dinamice, utilizând exec, eval și type, și am analizat avantajele și dezavantajele utilizării codului dinamic.

Am prezentat conceptul de decoratori în Python și am arătat cum să creați decoratori simpli, cu argumente și pentru clase și metode. De asemenea, am discutatdespre metaclasses și rolul lor în personalizarea procesului de creare a claselor în Python.

Am introdus introspecția și reflecția și am arătat cum să folosim modulul inspect pentru a examina obiectele în timpul rulării și cum să modificăm obiectele dinamic cu ajutorul reflecției.

În final, am recapitulat lecția și am oferit bune practici pentru metaprogramare și cod dinamic. Cunoștințele dobândite în această lecție ne vor ajuta să scriem cod mai flexibil și să explorăm și să manipulăm obiectele și codul într-un mod mai avansat.