| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | 
class CustomProperty:    def __init__(self, fget=None, fset=None):        self.fget = fget        self.fset = fset    def __set_name__(self, owner_class, prop_name):        self.prop_name = prop_name        def __get__(self, instance, owner_class):        print('__get__ called...')        if instance is None:            return self        if self.fget is None:            raise AttributeError(f'{self.prop_name} is not readble.')        return self.fget(instance)        def __set__(self, instance, value):        print('__set__ called...')        if self.fset is None:            raise AttributeError(f'{self.prop_name} is not writable.')        self.fset(instance, value)    def setter(self, fset):        self.fset = fset        return self    class Person:    @CustomProperty    def first_name(self):        return getattr(self, '_first_name', None)        @first_name.setter    def first_name(self, value):        self._first_name = value    @CustomProperty    def last_name(self):        return getattr(self, '_last_name', None)        @last_name.setter    def last_name(self, value):        self._last_name = valuedef test():    p = Person()    print(p.__dict__)    p.name = 'Artem'    print(p.name)    print(p.__dict__)    # пробуем затемнить дескриптор    p.__dict__['name'] = 'Egor'    print(p.name)def main():    test()if __name__ == '__main__':    main()
 |