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 하는 등의 디스크립터를 만들겠지
댓글 0