Skip to content
Foxipa
Code Completion 4 Challenges

Complete the Python Descriptor Code

Practice implementing __get__, __set_name__, __set__, and __delete__ in reusable descriptors.

Advanced ~9 min read

Challenge 1

Complete __get__ so class access returns the descriptor and instance access returns the stored value.

python Your answer
class Field:
    def __get__(self, instance, owner):
        

class User:
    name = Field()

user = User()
user._name = "Mina"
print(user.name)
print(User.name is User.__dict__["name"])

Press Ctrl⌘Enter to check your answer

Challenge 2

Use __set_name__ and __set__ so the descriptor stores values under a private attribute based on its assigned name.

python Your answer
class Stored:
    def __set_name__(self, owner, name):
        

    def __get__(self, instance, owner):
        if instance is None:
            return self
        return getattr(instance, self.storage_name)

    def __set__(self, instance, value):
        setattr(instance, self.storage_name, value)

class User:
    name = Stored()

user = User()
user.name = "Mina"
print(user.name)

Press Ctrl⌘Enter to check your answer

Challenge 3

Validate that score is an integer greater than zero before storing it.

python Your answer
class PositiveScore:
    def __set_name__(self, owner, name):
        self.storage_name = "_" + name

    def __get__(self, instance, owner):
        if instance is None:
            return self
        return getattr(instance, self.storage_name)

    def __set__(self, instance, value):
        

class Player:
    score = PositiveScore()

player = Player()
player.score = 10
print(player.score)
try:
    player.score = 0
except ValueError as error:
    print(type(error).__name__)

Press Ctrl⌘Enter to check your answer

Challenge 4

Implement __delete__ so deleting the descriptor-managed value restores the backing state to None.

python Your answer
class Resettable:
    def __set_name__(self, owner, name):
        self.storage_name = "_" + name

    def __get__(self, instance, owner):
        if instance is None:
            return self
        return getattr(instance, self.storage_name, None)

    def __set__(self, instance, value):
        setattr(instance, self.storage_name, value)

    def __delete__(self, instance):
        

class Session:
    token = Resettable()

session = Session()
session.token = "abc"
print(session.token)
del session.token
print(session.token)

Press Ctrl⌘Enter to check your answer