Przejdź do treści głównej
🔒 Tryb podglądu. Pierwszych piętnaście lekcji Foundations jest darmowych; ta jest Pro. Rozpocznij 7-dniowy trial, aby odblokować edytor, podpowiedzi AI i resztę kursu. Wymagana karta, anulujesz w dowolnym momencie w Dashboard.Rozpocznij 7-dniowy trial →
← KursySenior Deep-DivesModule 11 · Decorator patterns at scaleDescriptor protocol — the mechanic under @property and ORM columnspredict155 / 161
+150 XP
Zadanie
📝 **Zadanie:** Przewiduj 4-liniowy wynik. Deskryptor `Pozytywny` sprawdza, czy przypisania są dodatnimi wartościami typu int. Klasa `Account` używa go dla dwóch atrybutów (saldo + wiek). Test: normalny set + get działa, wartość ujemna wyzwala ValueError, dostęp na poziomie klasy zwraca sam deskryptor (nie wartość), wartości poszczególnych instancji są niezależne. 📋 Zaimplementuj powyższą funkcję. Testy uruchamiają się automatycznie. 💡 **Wskazówka:** Jeśli utkniesz, przeczytaj ponownie teorię.
Przewiduj wynik

Przeczytaj kod uważnie

class Positive:
    def __set_name__(self, owner, name: str) -> None:
        self.name = name

    def __get__(self, instance, owner):
        if instance is None:
            return self
        return instance.__dict__[self.name]

    def __set__(self, instance, value) -> None:
        if not isinstance(value, int) or value <= 0:
            raise ValueError(f"{self.name} must be positive int, got {value!r}")
        instance.__dict__[self.name] = value


class Account:
    balance = Positive()
    age = Positive()


a = Account()
a.balance = 100
a.age = 30
print(a.balance, a.age)

try:
    a.balance = -5
except ValueError as e:
    print(f"rejected: {e}")

# Class-level access returns the descriptor itself, not a value
print(type(Account.balance).__name__)

# Per-instance values are independent
b = Account()
b.balance = 200
print(a.balance, b.balance)

Co wypisze program? Napisz tutaj:

💬 Dyskusja

Zadaj pierwsze pytanie lub podziel się wskazówką.
Zaloguj się aby dołączyć do dyskusji. Czytanie jest darmowe.
Ładowanie dyskusji…