class SimpleDescriptor:
    def __init__(self, name, initial=None):
        self.name = '_' + name
        self.initial = initial

    def __get__(self, instance, owner):
        if self.name not in instance.__dict__:
            instance.__dict__[self.name] = self.initial
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        instance.__dict__[self.name] = value

    def __delete__(self, instance):
        del(instance.__dict__[self.name])

def set_desc(*prop_args, **prop_kwargs):
    def deco(cls):
        for prop in prop_args:
            setattr(cls, prop, SimpleDescriptor(prop))
        for prop, initial in prop_kwargs.items():
            setattr(cls, prop, SimpleDescriptor(prop, initial))
        return cls
    return deco

@set_desc('model', price=1000)
class Car:
    pass

tico = Car()
print(tico.model) # None
print(tico.price) # 1000

tico.model = 'Tico'
tico.price = 3000
print(tico.model) # Tico
print(tico.price) # 3000




기본값 지정 외에 별다른 기능이 없는 디스크립터 만들고, 이 디스크립터를 클래스에 심어주는 데코레이터 만든 후 클래스에 상황 별로 적용

물론 실제로는 고작 이런 일에 쓰는 건 오버고 보통 값을 validation, modification 하는 등의 디스크립터를 만들겠지