рдХреИрд╢реНрдб_рдкреНрд░реЛрд╕реЗрд╕рд░ рдбреЗрдХреЛрд░реЗрдЯрд░

рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ?

class SomeClass(object): @property def param(self): if not hasattr(self, '_param'): self._param = computing() return self._param @param.setter def param(self, value): self._param = value @param.deleter def param(self): del self._param 

рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдкрд░рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓реНрдп рд╕реАрдзреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдЧрдгрдирд╛ рдкрд╣рд▓реА рдХреЙрд▓ рдкрд░ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдорд╛рди рдЕрд╕реНрдерд╛рдпреА рдирд╛рдо _param рдХреЗ рддрд╣рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЬрд┐рди рд╢рд░реНрддреЛрдВ рдкрд░ рдкрд░рдо рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓реЗ рдХреЙрд▓ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рдпрд╛ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рддреБрд░рдВрдд рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рдЬреНрдЮрд╛рдд рд╣реИред

рдЗрд╕ рдХреЛрдб рдХреЗ рдЕрдкрдиреЗ minuses рд╣реИрдВ: рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ _param рдирд╛рдордХ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ; рд╣рд░ рдмрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рдо () рдкрджреНрдзрддрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣реЕрдЯрдЯреНрд░рд╛ рдХрд░рддрд╛ рд╣реИ; рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рдРрд╕реА рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред

рдЖрдк рд╡рд╕реНрддреБ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдХреЗ _рдкрд░рдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 class SomeClass(object): @property def param(self): if 'param' not in self.__dict__: self.__dict__['param'] = computing() return self.__dict__['param'] @param.setter def param(self, value): self.__dict__['param'] = value @param.deleter def param(self): del self.__dict__['param'] 

рдпрд╣рд╛рдВ, рдкрд░рд┐рдХрд▓рд┐рдд рдорд╛рди рдЙрд╕реА рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ @property рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ (рдШреЛрд╖рд┐рдд рд╡рд┐рдзрд┐ __set __ () рдХрд╣реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░), рд╣рдорд╛рд░реЗ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдбрд┐рдХреНрд╢рдирд░реА __dict__ рдореЗрдВ рд╣реЛред рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдо рдЗрд╕ __dict__ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдИ рд╕рдВрдШрд░реНрд╖ рдФрд░ рдЕрдВрддрд╣реАрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рд▓реЗрдХрд┐рди рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВред рдПрдХ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рджреВрд╕рд░рд╛ рдХреЗрд╡рд▓ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрдЧрд╛ред рдЖрдЗрдП рдПрдХ рдЕрд▓рдЧ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рд╕рднреА рдореЛрдЯреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдФрд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class SomeClass(object): @cached_property def param(self): return computing() 

рдмрд╛рдХреА рдХреЛрдб рдбреЗрдХреЛрд░реЗрдЯрд░ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рд╣реА рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 class cached_property(object): def __init__(self, func): self.func = func self.name = func.__name__ def __get__(self, instance, cls=None): if self.name not in instance.__dict__: result = instance.__dict__[self.name] = self.func(instance) return result return instance.__dict__[self.name] def __set__(self, instance, value): instance.__dict__[self.name] = value def __delete__(self, instance): del instance.__dict__[self.name] 

рдХреЛрдИ рд╡рд╣рд╛рдВ рд░реБрдХ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдбреЗрдЯрд╛ рдФрд░ рдЧреИрд░-рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧреИрд░-рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдореЗрдВ рдХреЗрд╡рд▓ __get __ () рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдореВрд▓реНрдп рд╣реИред рдпрд╛рдиреА рдпрджрд┐ рд╣рдо __set __ () рдФрд░ __delete __ () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрдИ рдмрд╛рд░ @cached_property рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

 class cached_property(object): def __init__(self, func): self.func = func def __get__(self, instance, cls=None): result = instance.__dict__[self.func.__name__] = self.func(instance) return result 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рдХрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ django.utils.functional рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Django 1.4 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрддрдирд╛ рд╕рд░рд▓ рдФрд░ рд╕рд╕реНрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 class SomeList(object): storage_pattern = 'some-list-by-pages-{}-{}' def __init__(self, page_num, per_page): self.page_num, self.per_page = page_num, per_page self.storage_key = self.storage_pattern.format(page_num, per_page) 

рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 class SomeList(object): storage_pattern = 'some-list-by-pages-{}-{}' def __init__(self, page_num, per_page): self.page_num, self.per_page = page_num, per_page @cached_property def storage_key(self): return self.storage_pattern.format(self.page_num, self.per_page) 

Source: https://habr.com/ru/post/In159099/


All Articles