ุงู„ุตูุงุช ูˆุงู„ุชุนุงู…ู„ ู…ุน ุงู„ุจุฑูˆุชูˆูƒูˆู„ ููŠ ุจูŠุซูˆู†

ุงู„ู†ุธุฑ ููŠ ุงู„ุชุนู„ูŠู…ุงุช ุงู„ุจุฑู…ุฌูŠุฉ ุงู„ุชุงู„ูŠุฉ:


class Foo: def __init__(self): self.bar = 'hello!' foo = Foo() print(foo.bar) 

ุงู„ูŠูˆู… ุณูˆู ู†ุญู„ู„ ุงู„ุฅุฌุงุจุฉ ุนู„ู‰ ุงู„ุณุคุงู„: "ู…ุงุฐุง ูŠุญุฏุซ ุจุงู„ุถุจุท ุนู†ุฏู…ุง ู†ูƒุชุจ foo.bar ุŸ"




ุฑุจู…ุง ุชุนู„ู… ุจุงู„ูุนู„ ุฃู† ู…ุนุธู… ุงู„ูƒุงุฆู†ุงุช ุชุญุชูˆูŠ ุนู„ู‰ ู‚ุงู…ูˆุณ __dict__ ุฏุงุฎู„ูŠ ูŠุญุชูˆูŠ ุนู„ู‰ ุฌู…ูŠุน ุณู…ุงุชู‡ุง. ูˆู…ุง ูŠุจุนุซ ุนู„ู‰ ุงู„ุณุฑูˆุฑ ุจุดูƒู„ ุฎุงุต ู‡ูˆ ู…ุฏู‰ ุณู‡ูˆู„ุฉ ุฏุฑุงุณุฉ ู…ุซู„ ู‡ุฐู‡ ุงู„ุชูุงุตูŠู„ ู…ู†ุฎูุถุฉ ุงู„ู…ุณุชูˆู‰ ููŠ ุจูŠุซูˆู†:


 >>> foo = Foo() >>> foo.__dict__ {'bar': 'hello!'} 

ู„ู†ุจุฏุฃ ุจู…ุญุงูˆู„ุฉ ุตูŠุงุบุฉ ู‡ุฐู‡ ุงู„ูุฑุถูŠุฉ (ุบูŠุฑ ุงู„ู…ูƒุชู…ู„ุฉ):


foo.bar ู…ูƒุงูุฆ ู„ู€ foo .__ dict __ ['bar'] .


ููŠ ุญูŠู† ูŠุจุฏูˆ ู…ุซู„ ุงู„ุญู‚ูŠู‚ุฉ:


 >>> foo = Foo() >>> foo.__dict__['bar'] 'hello!' 


ู„ู†ูุชุฑุถ ุงู„ุขู† ุฃู†ูƒ ุชุฏุฑูƒ ุจุงู„ูุนู„ ุฃู†ู‡ ูŠู…ูƒู† ุชุนุฑูŠู ุงู„ุณู…ุงุช ุงู„ุฏูŠู†ุงู…ูŠูƒูŠุฉ ููŠ ุงู„ูุตูˆู„ ุงู„ุฏุฑุงุณูŠุฉ:


 >>> class Foo: ... def __init__(self): ... self.bar = 'hello!' ... ... def __getattr__(self, item): ... return 'goodbye!' ... ... foo = Foo() >>> foo.bar 'hello!' >>> foo.baz 'goodbye!' >>> foo.__dict__ {'bar': 'hello!'} 

ุญุณู†ู‹ุง ... ุญุณู†ู‹ุง. ูŠู…ูƒู† ู…ู„ุงุญุธุฉ ุฃู† __getattr__ ูŠู…ูƒู† ุฃู† ุชุญุงูƒูŠ ุงู„ูˆุตูˆู„ ุฅู„ู‰ ุงู„ุณู…ุงุช "ุงู„ู…ุฒูŠูุฉ" ุŒ ู„ูƒู†ู‡ุง ู„ู† ุชุนู…ู„ ุฅุฐุง ูƒุงู† ู‡ู†ุงูƒ ุจุงู„ูุนู„ ู…ุชุบูŠุฑ ู…ูุนู„ู† (ู…ุซู„ foo.bar ูŠูุฑุฌุน "ู…ุฑุญุจู‹ุง!" ูˆู„ูŠุณ "ูˆุฏุงุนู‹ุง!" ). ูŠุจุฏูˆ ุฃู† ูƒู„ ุดูŠุก ุฃูƒุซุฑ ุชุนู‚ูŠุฏู‹ุง ู…ู…ุง ุจุฏุง ููŠ ุงู„ุจุฏุงูŠุฉ.


ูˆุจุงู„ูุนู„: ู‡ู†ุงูƒ ุทุฑูŠู‚ุฉ ุณุญุฑูŠุฉ ุชุณู…ู‰ ูƒู„ู…ุง ุญุงูˆู„ู†ุง ุงู„ุญุตูˆู„ ุนู„ู‰ ุณู…ุฉ ุŒ ูˆู„ูƒู† ุŒ ูƒู…ุง ู‡ูˆ ู…ูˆุถุญ ุฃุนู„ุงู‡ ุŒ ู„ูŠุณุช ู‡ุฐู‡ __getattr__ . ุชุณู…ู‰ ุงู„ุทุฑูŠู‚ุฉ ุงู„ุชูŠ ูŠุทู„ู‚ ุนู„ูŠู‡ุง __getattribute__ ุŒ ูˆุณู†ุญุงูˆู„ ูู‡ู… ูƒูŠู ุชุนู…ู„ ุจุงู„ุถุจุท ู…ู† ุฎู„ุงู„ ู…ุฑุงู‚ุจุฉ ุงู„ู…ูˆุงู‚ู ุงู„ู…ุฎุชู„ูุฉ.


ุญุชู‰ ุงู„ุขู† ุŒ ู†ู‚ูˆู… ุจุชุนุฏูŠู„ ูุฑุถูŠุชู†ุง ุนู„ู‰ ุงู„ู†ุญูˆ ุงู„ุชุงู„ูŠ:


foo.bar ู…ูƒุงูุฆ ู„ู€ foo .__ getattribute __ ('bar') ุŒ ูˆุงู„ุฐูŠ ูŠุนู…ู„ ุชู‚ุฑูŠุจู‹ุง ู…ุซู„ ู‡ุฐุง:



 def __getattribute__(self, item): if item in self.__dict__: return self.__dict__[item] return self.__getattr__(item) 

ุณู†ุฎุชุจุฑู‡ุง ุนู† ุทุฑูŠู‚ ุชุทุจูŠู‚ ู‡ุฐู‡ ุงู„ุทุฑูŠู‚ุฉ (ุชุญุช ุงุณู… ู…ุฎุชู„ู) ูˆู†ุทู„ู‚ ุนู„ูŠู‡ุง ู…ุจุงุดุฑุฉ:


 >>> class Foo: ... def __init__(self): ... self.bar = 'hello!' ... ... def __getattr__(self, item): ... return 'goodbye!' ... ... def my_getattribute(self, item): ... if item in self.__dict__: ... return self.__dict__[item] ... return self.__getattr__(item) >>> foo = Foo() >>> foo.bar 'hello!' >>> foo.baz 'goodbye!' >>> foo.my_getattribute('bar') 'hello!' >>> foo.my_getattribute('baz') 'goodbye!' 

ูŠุจุฏูˆ ุตุญูŠุญุง ุŒ ุฃู„ูŠุณ ูƒุฐู„ูƒุŸ



ุญุณู†ู‹ุง ุŒ ูƒู„ ู…ุง ุชุจู‚ู‰ ู‡ูˆ ุงู„ุชุญู‚ู‚ ู…ู† ุฃู† ู…ู‡ู…ุฉ ุงู„ู…ุชุบูŠุฑุงุช ู…ุฏุนูˆู…ุฉ ุŒ ูˆุจุนุฏ ุฐู„ูƒ ูŠู…ูƒู†ูƒ ุงู„ุนูˆุฏุฉ ุฅู„ู‰ ุงู„ู…ู†ุฒู„ ... -


 >>> foo.baz = 1337 >>> foo.baz 1337 >>> foo.my_getattribute('baz') = 'h4x0r' SyntaxError: can't assign to function call 

ู„ุนู†ุฉ.


ุฅุฑุฌุงุน my_getattribute ูƒุงุฆู†. ูŠู…ูƒู†ู†ุง ุชุบูŠูŠุฑู‡ ุฅุฐุง ูƒุงู† ู‚ุงุจู„ุงู‹ ู„ู„ุชุบูŠูŠุฑ ุŒ ู„ูƒู† ู„ุง ูŠู…ูƒู†ู†ุง ุงุณุชุจุฏุงู„ู‡ ุจู…ุณุชุฎุฏู… ุขุฎุฑ ุจุงุณุชุฎุฏุงู… ู…ุดุบู„ ุงู„ู…ู‡ู…ุฉ. ู…ุงุฐุง ุชูุนู„ุŸ ุจุนุฏ ูƒู„ ุดูŠุก ุŒ ุฅุฐุง ูƒุงู† foo.baz ู…ูƒุงูุฆู‹ุง ู„ุงุณุชุฏุนุงุก ุฏุงู„ุฉ ุŒ ููƒูŠู ูŠู…ูƒู†ู†ุง ุชุนูŠูŠู† ู‚ูŠู…ุฉ ุฌุฏูŠุฏุฉ ู„ุณู…ุฉ ู…ู† ุญูŠุซ ุงู„ู…ุจุฏุฃุŸ


ุนู†ุฏู…ุง ู†ู†ุธุฑ ุฅู„ู‰ ุชุนุจูŠุฑ ู…ุซู„ foo.bar = 1 ุŒ ู‡ู†ุงูƒ ู…ุง ู‡ูˆ ุฃูƒุซุฑ ู…ู† ู…ุฌุฑุฏ ุงุณุชุฏุนุงุก ุฏุงู„ุฉ ู„ู„ุญุตูˆู„ ุนู„ู‰ ู‚ูŠู…ุฉ foo.bar . ูŠุจุฏูˆ ุฃู† ุชุนูŠูŠู† ู‚ูŠู…ุฉ ุฅู„ู‰ ุณู…ุฉ ูŠุฎุชู„ู ุงุฎุชู„ุงูู‹ุง ุฃุณุงุณูŠู‹ุง ุนู† ุงู„ุญุตูˆู„ ุนู„ู‰ ู‚ูŠู…ุฉ ุณู…ุฉ. ูˆุงู„ุญู‚ูŠู‚ุฉ: ูŠู…ูƒู†ู†ุง ุชู†ููŠุฐ __setattr__ ู„ุฑุคูŠุฉ ู‡ุฐุง:


 >>> class Foo: ... def __init__(self): ... self.__dict__['my_dunder_dict'] = {} ... self.bar = 'hello!' ... ... def __setattr__(self, item, value): ... self.my_dunder_dict[item] = value ... ... def __getattr__(self, item): ... return self.my_dunder_dict[item] >>> foo = Foo() >>> foo.bar 'hello!' >>> foo.bar = 'goodbye!' >>> foo.bar 'goodbye!' >>> foo.baz Traceback (most recent call last): File "<pyshell#75>", line 1, in <module> foo.baz File "<pyshell#70>", line 10, in __getattr__ return self.my_dunder_dict[item] KeyError: 'baz' >>> foo.baz = 1337 >>> foo.baz 1337 >>> foo.__dict__ {'my_dunder_dict': {'bar': 'goodbye!', 'baz': 1337}} 

ู‡ู†ุงูƒ ุฃู…ุฑุงู† ูŠุฌุจ ู…ู„ุงุญุธุชู‡ู…ุง ุจุฎุตูˆุต ู‡ุฐุง ุงู„ุฑู…ุฒ:


  1. __setattr__ ู„ุง ูŠูˆุฌุฏ ู„ุฏูŠู‡ ู†ุธูŠุฑ __getattribute__ (ุฃูŠ ุŒ ุทุฑูŠู‚ุฉ __setattribute__ ุงู„ุณุญุฑูŠุฉ ุบูŠุฑ ู…ูˆุฌูˆุฏุฉ).
  2. ูŠุชู… ุงุณุชุฏุนุงุก __setattr__ ุฏุงุฎู„ __init__ ุŒ ูˆู‡ุฐุง ู‡ูˆ ุงู„ุณุจุจ ููŠ ุฃู†ู†ุง ู…ุฌุจุฑูˆู† ุนู„ู‰ ูุนู„ ุงู„ุฐุงุช. __ dict __ ['my_dunder_dict'] = {} ุจุฏู„ุงู‹ ู…ู† self.my_dunder_dict = {} . ุฎู„ุงู ุฐู„ูƒ ุŒ ุณู†ูˆุงุฌู‡ ุงู„ุนูˆุฏูŠุฉ ู„ุงู†ู‡ุงุฆูŠุฉ.


ูˆู„ูƒู† ู„ุฏูŠู†ุง ุฃูŠุถุง ุงู„ู…ู„ูƒูŠุฉ (ูˆุฃุตุฏู‚ุงุฆู‡). ุฏูŠูƒูˆุฑ ูŠุณู…ุญ ู„ู„ุทุฑู‚ ุฃู† ุชุนู…ู„ ูƒุณู…ุงุช.


ุฏุนูˆู†ุง ู†ุญุงูˆู„ ุฃู† ู†ูู‡ู… ูƒูŠู ูŠุญุฏุซ ู‡ุฐุง.


 >>> class Foo(object): ... def __getattribute__(self, item): ... print('__getattribute__ was called') ... return super().__getattribute__(item) ... ... def __getattr__(self, item): ... print('__getattr__ was called') ... return super().__getattr__(item) ... ... @property ... def bar(self): ... print('bar property was called') ... return 100 >>> f = Foo() >>> f.bar __getattribute__ was called bar property was called 

ู„ู„ู…ุชุนุฉ ูู‚ุท ุŒ ู…ุงุฐุง ู„ุฏูŠู†ุง ููŠ f .__ dict__ ุŸ


 >>> f.__dict__ __getattribute__ was called {} 

ู„ุง ูŠูˆุฌุฏ ู…ูุชุงุญ ุดุฑูŠุท ููŠ __dict__ ุŒ ู„ูƒู† __getattr__ ู„ุง ูŠุชู… ุงุณุชุฏุนุงุกู‡ ู„ุณุจุจ ู…ุง. WATุŸ


bar ู‡ูŠ ุทุฑูŠู‚ุฉ ุชุฃุฎุฐ ู†ูุณู‡ุง ูƒู…ุนู„ู…ุฉ ุŒ ูˆู‡ุฐู‡ ุงู„ุทุฑูŠู‚ุฉ ู‡ูŠ ูู‚ุท ููŠ ุงู„ูุตู„ ุงู„ุฏุฑุงุณูŠ ุŒ ูˆู„ูŠุณ ููŠ ู…ุซูŠู„ ุงู„ูุฆุฉ. ูˆู‡ุฐุง ู…ู† ุงู„ุณู‡ู„ ุฃู† ู†ุฑู‰:


 >>> Foo.__dict__ mappingproxy({'__dict__': <attribute '__dict__' of 'Foo' objects>, '__doc__': None, '__getattr__': <function Foo.__getattr__ at 0x038308A0>, '__getattribute__': <function Foo.__getattribute__ at 0x038308E8>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Foo' objects>, 'bar': <property object at 0x0381EC30>}) 

ู…ูุชุงุญ ุงู„ุดุฑูŠุท ู…ูˆุฌูˆุฏ ุจุงู„ูุนู„ ููŠ ู‚ุงู…ูˆุณ ุณู…ุฉ ุงู„ูุตู„. ู„ูู‡ู… ูƒูŠู ูŠุนู…ู„ __getattribute__ ุŒ ู†ุญุชุงุฌ ุฅู„ู‰ ุงู„ุฅุฌุงุจุฉ ุนู„ู‰ ุงู„ุณุคุงู„: ู…ู† ุงู„ุฐูŠ __getattribute__ ูŠุณู…ู‰ ู…ู† ู‚ุจู„ - ูุฆุฉ ุฃู… ู…ุซูŠู„ุŸ


 >>> f.__dict__['bar'] = 'will we see this printed?' __getattribute__ was called >>> f.bar __getattribute__ was called bar property was called 100 

ูŠู…ูƒู† ู…ู„ุงุญุธุฉ ุฃู† ุฃูˆู„ ุดูŠุก ูŠุชู… ุงู„ุชุญู‚ู‚ ู…ู†ู‡ ููŠ ูุฆุฉ __dict__ ุŒ ุฃูŠ ู„ู‡ุง ุฃูˆู„ูˆูŠุฉ ุนู„ู‰ ุงู„ู…ุซุงู„.



ุงู†ุชุธุฑ ู„ุญุธุฉ ุŒ ู…ุชู‰ ุงุชุตู„ู†ุง ุจุทุฑูŠู‚ุฉ ุงู„ุจุงุฑ ุŸ ุฃู‚ุตุฏ ุŒ ุงู„ูƒูˆุฏ ุงู„ุฒุงุฆู ุงู„ุฎุงุต ุจู†ุง ู„ู€ __getattribute__ ู„ุง ูŠุณุชุฏุนูŠ ูƒุงุฆู†ู‹ุง ุฃุจุฏู‹ุง. ู…ุง ุงู„ุฐูŠ ูŠุญุฏุซุŸ


ุชู„ุจูŠุฉ ุจุฑูˆุชูˆูƒูˆู„ ูˆุงุตู :


descr .__ get __ (selfุŒ objุŒ type = None) -> value


descr .__ set __ (selfุŒ objุŒ value) -> None


descr .__ delete __ (selfุŒ obj) -> None



ุจูŠุช ุงู„ู‚ุตูŠุฏ ู‡ู†ุง. ู‚ู… ุจุชุทุจูŠู‚ ุฃูŠ ู…ู† ู‡ุฐู‡ ุงู„ุทุฑู‚ ุงู„ุซู„ุงุซ ุจุญูŠุซ ูŠุตุจุญ ุงู„ูƒุงุฆู† ูˆุงุตูู‹ุง ูˆูŠู…ูƒู†ู‡ ุชุบูŠูŠุฑ ุงู„ุณู„ูˆูƒ ุงู„ุงูุชุฑุงุถูŠ ุนู†ุฏ ุงู„ุชุนุงู…ู„ ู…ุนู‡ ูƒุณู…ุฉ.



ุฅุฐุง ุฃุนู„ู† ูƒุงุฆู† ุนู† __get __ () ูˆ __set __ () ุŒ ูุณูŠุทู„ู‚ ุนู„ูŠู‡ ูˆุงุตู ุงู„ุจูŠุงู†ุงุช. ุชุณู…ู‰ ูˆุงุตูุงุช ุชุทุจูŠู‚ ูู‚ุท __get __ () ูˆุงุตูุงุช ุบูŠุฑ ุงู„ุจูŠุงู†ุงุช.



ูŠุฎุชู„ู ูƒู„ุง ุงู„ู†ูˆุนูŠู† ู…ู† ุงู„ูˆุงุตูุงุช ููŠ ูƒูŠููŠุฉ ุงู„ูƒุชุงุจุฉ ููˆู‚ ุนู†ุงุตุฑ ู‚ุงู…ูˆุณ ุณู…ุฉ ุงู„ูƒุงุฆู†. ุฅุฐุง ูƒุงู† ุงู„ู‚ุงู…ูˆุณ ูŠุญุชูˆูŠ ุนู„ู‰ ู…ูุชุงุญ ูŠุญู…ู„ ู†ูุณ ุงุณู… ูˆุงุตู ุงู„ุจูŠุงู†ุงุช ุŒ ูุฅู† ูˆุงุตู ุงู„ุจูŠุงู†ุงุช ูŠูƒูˆู† ู„ู‡ ุงู„ุฃุณุจู‚ูŠุฉ (ุฃูŠ ุŒ __set __ () ูŠุณู…ู‰). ุฅุฐุง ูƒุงู† ุงู„ู‚ุงู…ูˆุณ ูŠุญุชูˆูŠ ุนู„ู‰ ู…ูุชุงุญ ูŠุญู…ู„ ู†ูุณ ุงุณู… ุงู„ูˆุงุตู ุจุฏูˆู† ุจูŠุงู†ุงุช ุŒ ูุณูŠูƒูˆู† ู„ู„ู‚ุงู…ูˆุณ ุงู„ุฃูˆู„ูˆูŠุฉ (ุฃูŠ ุŒ ุชุชู… ุงู„ูƒุชุงุจุฉ ููˆู‚ ุนู†ุตุฑ ุงู„ู‚ุงู…ูˆุณ).



ู„ุฅู†ุดุงุก ูˆุงุตู ุจูŠุงู†ุงุช ู„ู„ู‚ุฑุงุกุฉ ูู‚ุท ุŒ ู‚ู… ุจุชุนุฑูŠู ูƒู„ ู…ู† __get __ () ูˆ __set __ () ุŒ ุญูŠุซ ูŠุฑู…ูŠ __set __ () ุนู„ู‰ AttributeError ุนู†ุฏ ุงู„ุงุชุตุงู„ ุจู‡. ุชุทุจูŠู‚ __set __ () ู‡ุฐุง ูŠูƒููŠ ู„ุฅู†ุดุงุก ูˆุงุตู ุจูŠุงู†ุงุช.


ุจุงุฎุชุตุงุฑ ุŒ ุฅุฐุง ุฃุนู„ู†ุช ุฃูŠู‹ุง ู…ู† ู‡ุฐู‡ ุงู„ุทุฑู‚ __get__ ุฃูˆ __set__ ุฃูˆ __delete__ ุŒ ูุฃู†ุช ุชู†ูุฐ ุงู„ุฏุนู… ู„ุจุฑูˆุชูˆูƒูˆู„ ุงู„ูˆุงุตู. ูˆู‡ุฐุง ู‡ูˆ ุจุงู„ุถุจุท ู…ุง ูŠูุนู„ู‡ ู…ุตู…ู… ุงู„ู…ู…ุชู„ูƒุงุช : ูู‡ูˆ ูŠุนู„ู† ุนู† ูˆุงุตู ู„ู„ู‚ุฑุงุกุฉ ูู‚ุท ุณูŠุชู… ุงุณุชุฏุนุงุคู‡ ููŠ __getattribute__ .


ุขุฎุฑ ุชุบูŠูŠุฑ ููŠ ุชุทุจูŠู‚ู†ุง:


foo.bar ู…ูƒุงูุฆ ู„ู€ foo .__ getattribute __ ('bar') ุŒ ูˆุงู„ุฐูŠ ูŠุนู…ู„ ุชู‚ุฑูŠุจู‹ุง ู…ุซู„ ู‡ุฐุง:



 def __getattribute__(self, item): if item in self.__class__.__dict__: v = self.__class__.__dict__[item] elif item in self.__dict__: v = self.__dict__[item] else: v = self.__getattr__(item) if hasattr(v, '__get__'): v = v.__get__(self, type(self)) return v 

ุฏุนู†ุง ู†ุญุงูˆู„ ุงู„ุชูˆุถูŠุญ ููŠ ุงู„ู…ู…ุงุฑุณุฉ:


 class Foo: class_attr = "I'm a class attribute!" def __init__(self): self.dict_attr = "I'm in a dict!" @property def property_attr(self): return "I'm a read-only property!" def __getattr__(self, item): return "I'm dynamically returned!" def my_getattribute(self, item): if item in self.__class__.__dict__: print('Retrieving from self.__class__.__dict__') v = self.__class__.__dict__[item] elif item in self.__dict__: print('Retrieving from self.__dict__') v = self.__dict__[item] else: print('Retrieving from self.__getattr__') v = self.__getattr__(item) if hasattr(v, '__get__'): print("Invoking descriptor's __get__") v = v.__get__(self, type(self)) return v 


 >>> foo = Foo() ... ... print(foo.class_attr) ... print(foo.dict_attr) ... print(foo.property_attr) ... print(foo.dynamic_attr) ... ... print() ... ... print(foo.my_getattribute('class_attr')) ... print(foo.my_getattribute('dict_attr')) ... print(foo.my_getattribute('property_attr')) ... print(foo.my_getattribute('dynamic_attr')) I'm a class attribute! I'm in a dict! I'm a read-only property! I'm dynamically returned! Retrieving from self.__class__.__dict__ I'm a class attribute! Retrieving from self.__dict__ I'm in a dict! Retrieving from self.__class__.__dict__ Invoking descriptor's __get__ I'm a read-only property! Retrieving from self.__getattr__ I'm dynamically returned! 


ู†ุญู† ูู‚ุท ุฎุฏุด ุณุทุญ ุชู†ููŠุฐ ุงู„ุณู…ุฉ ููŠ ุจูŠุซูˆู† ู‚ู„ูŠู„ุง. ุนู„ู‰ ุงู„ุฑุบู… ู…ู† ุฃู† ุงู„ู…ุญุงูˆู„ุฉ ุงู„ุฃุฎูŠุฑุฉ ู„ู…ุญุงูƒุงุฉ foo.bar ุตุญูŠุญุฉ ุจุดูƒู„ ุนุงู… ุŒ ุถุน ููŠ ุงุนุชุจุงุฑูƒ ุฃู†ู‡ ู‚ุฏ ุชูƒูˆู† ู‡ู†ุงูƒ ุฏุงุฆู…ู‹ุง ุชูุงุตูŠู„ ุตุบูŠุฑุฉ ูŠุชู… ุชู†ููŠุฐู‡ุง ุจุทุฑูŠู‚ุฉ ู…ุฎุชู„ูุฉ.


ุขู…ู„ ุฃู†ู‡ ุจุงู„ุฅุถุงูุฉ ุฅู„ู‰ ู…ุนุฑูุฉ ูƒูŠููŠุฉ ุนู…ู„ ุงู„ุณู…ุงุช ุŒ ุชู…ูƒู†ุช ุฃูŠุถู‹ุง ู…ู† ุฅูŠุตุงู„ ุฌู…ุงู„ ุงู„ู„ุบุฉ ุงู„ุชูŠ ุชุดุฌุนูƒ ุนู„ู‰ ุงู„ุชุฌุฑุจุฉ. ุณุฏุงุฏ ุจุนุถ ุฏูŠูˆู† ุงู„ู…ุนุฑูุฉ ุงู„ูŠูˆู….

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


All Articles