рдкрд╛рдЗрдерди рдореЗрдВ рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЕрдЬрдЧрд░ рдХрд╛ рдЕрдВрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╕реНрдЯреНрд░реЗрдЯ рдХреИрд░реЗрдХреНрдЯрд░ ("\ u002E") рдЕрдкрдиреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рдЫреБрдкрд╛рддрд╛ рд╣реИ? рд╡рд╣ рдХреНрдпрд╛ рд░рд╣рд╕реНрдп рд░рдЦрддрд╛ рд╣реИ? рдпрджрд┐ рд░рд╣рд╕реНрдпрд╡рд╛рдж рдХреЗ рдмрд┐рдирд╛, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЦреЛрдЬрдирд╛ рдФрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рдлрд┐рд░ ... рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдкрдврд╝рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдЖрд╕рд╛рди, рд╕реБрдЦрдж рдФрд░ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╛рд╖рд╛ рдХреА рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рдордЭ рдФрд░ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ, рд╕рд╛рде рд╣реА рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рднреА рдЬрд╛рди рд╕рдХреЗрдВрдЧреЗред рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рд╕рд╣рд┐рдд рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрд╕ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬреЛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪреЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрдХрдЯреНрдареЗ рд╣реБрдП рд╣реИрдВ:

рдЕрд░реЗ рд╣рд╛рдБ, рд▓реЗрдЦ рдореЗрдВ рд╕рднреА рдЙрджрд╛рд╣рд░рдг python3 рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ! рдЗрд╕ рдкрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрдкрдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдордзреНрдпрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рддреЛ рд╢реБрд░реВ рдХрд░реЗрдВ!

__dict__


рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рджреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЕрдЬрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд (рдЬреИрд╕реЗ __class__ , __bases__ ) рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд, рдореИрдВ рдмрд╕ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред __dict__ рдЗрд╕ рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рд╕рд┐рд╕реНрдЯрдо" (рдЕрдЬрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд) рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬреА рдХреНрд░рдорд╢рдГ, рд╡рд┐рд╢реЗрд╖рддрд╛_рдирд╛рдо , рдореВрд▓реНрдп, рд╡рд┐рд╢реЗрд╖рддрд╛_рд╡рд╛рдпреБ рд╣реИ ред
рдУ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЬрдЧрд░ рд╕реНрдХреИрди:
  1. рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ ( o .__ рд╢реНрд░реБрддрд┐рдХрд╛ рдФрд░ рдЙрд╕рдХреА рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ)ред
  2. рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ ( рдУ .__ рдХреНрд▓рд╛рд╕ __.__ рдбрд┐рдХреНрдЯреНрд░реА )ред рдХреЗрд╡рд▓ __dict__ рдХрдХреНрд╖рд╛рдПрдВ, рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдирд╣реАрдВред
  3. рдЬрд┐рди рд╡рд░реНрдЧреЛрдВ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ ( рдУ .__ рдХреНрд▓рд╛рд╕ __.__ рдмреЗрд╕рд┐рд╕ __.__ рдбрд┐рдХреНрдЯреНрд░реА )ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, __dict__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ)ред

class StuffHolder: stuff = "class stuff" a = StuffHolder() b = StuffHolder() a.stuff # "class stuff" b.stuff # "class stuff" b.b_stuff = "b stuff" b.b_stuff # "b stuff" a.b_stuff # AttributeError 

рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде StuffHolder рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред B_stuff рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ b рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ ред
рдЖрдЗрдП рд╕рднреА рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ __dict__ рдХреЛ рджреЗрдЦреЗрдВ :

 StuffHolder.__dict__ # {... 'stuff': 'class stuff' ...} a.__dict__ # {} b.__dict__ # {'b_stuff': 'b stuff'} a.__class__ # <class '__main__.StuffHolder'> b.__class__ # <class '__main__.StuffHolder'> 
(__Dict__ рдореЗрдВ StuffHolder рдХреНрд▓рд╛рд╕ рдбрд┐рдХреНрдЯреЗрдЯ_рдкреНрд░реЛрдХреНрд╕реА рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдмрд╛рдбрд╝ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЕрднреА рддрдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

__Dict__ рдореЗрдВ рди рддреЛ b рдФрд░ рди рд╣реА рд╕рд╛рдорд╛рди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдкрд╛рдП рдмрд┐рдирд╛ рд╕рд░реНрдЪ рдЗрдВрдЬрди __dict__ рдХреНрд▓рд╛рд╕ ( StuffHolder ) рдореЗрдВ рдЦреЛрдЬрддрд╛ рд╣реИ, рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕реЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реМрдВрдкреЗ рдЧрдП рдорд╛рди рдХреЛ рдвреВрдВрдврддрд╛ рдФрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд░реНрдЧ рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБ рдХреЗ __class__ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЦреЛрдЬ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА, __dict__ рд╡рд░реНрдЧ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЙрдирдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:

 a.new_stuff # AttributeError b.new_stuff # AttributeError StuffHolder.new_stuff = "new" StuffHolder.__dict__ # {... 'stuff': 'class stuff', 'new_stuff': 'new'...} a.new_stuff # "new" b.new_stuff # "new" 

рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ __dict__ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЕрд░реНрдерд╛рдд, __dict__ рд╡рд░реНрдЧ рдореЗрдВ рдорд╛рди рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИ (рдпрджрд┐ рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдирд╣реАрдВ рд╣реИ):

 StuffHolder.__dict__ # {... 'stuff': 'class stuff' ...} c = StuffHolder() c.__dict__ # {} c.stuff = "more c stuff" c.__dict__ # {'stuff': 'more c stuff'} StuffHolder.__dict__ # {... 'stuff': 'class stuff' ...} 

рдпрджрд┐ рд╡рд░реНрдЧ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдореИрдЪ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдирд╛рдо, рджреБрднрд╛рд╖рд┐рдпрд╛ рдореВрд▓реНрдп рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдореВрд▓реНрдп рджреЗрдЦреЗрдВрдЧреЗ (рдпрджрд┐ рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдорд╛рди рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдирд╣реАрдВ рд╣реИ):

 StuffHolder.__dict__ # {... 'stuff': 'class stuff' ...} d = StuffHolder() d.stuff # "class stuff" d.stuff = "d stuff" d.stuff # "d stuff" 

рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ, рдпрд╣ рд╕рдм __dict__ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рднрдВрдбрд╛рд░ рд╣реИред рдЗрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ __dict__ рд╡рд░реНрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдорд╣рд╛рди рдФрд░ рдкрд░рд╛рдХреНрд░рдореА Descriptor рд╣реИ!

рд╡рд░реНрдгрдирдХрд░реНрддрд╛


рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕рдорд╛рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:

 class FuncHolder: def func(self): pass fh = FuncHolder() FuncHolder.func # <function func at 0x8f806ac> FuncHolder.__dict__ # {...'func': <function func at 0x8f806ac>...} fh.func # <bound method FuncHolder.func of <__main__.FuncHolder object at 0x900f08c>> 

рдбрдмреНрд▓реНрдпреВрдЯреАрдПрдл? рддреБрдо рдкреВрдЫрддреЗ рд╣реЛ ... рд╢рд╛рдпрджред рдореИрдВ рдкреВрдЫреВрдВрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ: __get__ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рдеред

 FuncHolder.func.__class__.__get__ # <slot wrapper '__get__' of 'function' objects> 

рдпрд╣ рд╡рд┐рдзрд┐ fh рдЙрджрд╛рд╣рд░рдг рдХреЗ рдлрдВрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХреЛ рдЧреИрд░-рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рдЙрдЯреЛ рд╕реЗ :
рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕реЗрд╕ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 descr .__ get __ (рдЖрддреНрдо, obj, рдкреНрд░рдХрд╛рд░ = рдХреЛрдИ рдирд╣реАрдВ) -> рдорд╛рди (рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ)
 descr .__ рд╕реЗрдЯ __ (рд╕реНрд╡рдпрдВ, obj, рдорд╛рди) -> рдХреЛрдИ рдирд╣реАрдВ (рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдПрдХ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реЛрддрд╛ рд╣реИ)
 descr .__ рдбрд┐рд▓реАрдЯ __

рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╣реИрдВ:
  1. рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ - рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ __get __ () рдФрд░ __set __ () рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
  2. рдЧреИрд░-рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирд╣реАрдВ?) - рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ __get __ () рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
рд╡реЗ __dict__ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ __dict__ рдореЗрдВ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ, рддреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИред рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдирд╛рдо "рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░" рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ __dict__ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЕрдзрд┐рдХ рд╣реИред

рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░

рдЖрдЗрдП рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

 class DataDesc: def __get__(self, obj, cls): print("Trying to access from {0} class {1}".format(obj, cls)) def __set__(self, obj, val): print("Trying to set {0} for {1}".format(val, obj)) def __delete__(self, obj): print("Trying to delete from {0}".format(obj)) class DataHolder: data = DataDesc() d = DataHolder() DataHolder.data # Trying to access from None class <class '__main__.DataHolder'> d.data # Trying to access from <__main__.DataHolder object at ...> class <class '__main__.DataHolder'> d.data = 1 # Trying to set 1 for <__main__.DataHolder object at ...> del(d.data) # Trying to delete from <__main__.DataHolder object at ...> 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ DataHolder.data рдХреЛ рдХреЙрд▓ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрдЬрд╛рдп __get__ рд╡рд┐рдзрд┐ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рдХрдерди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рддрд┐рдерд┐ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ __dict__ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдкрд░ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ:

 d.__dict__["data"] = "override!" d.__dict__ # {'data': 'override!'} d.data # Trying to access from <__main__.DataHolder object at ...> class <class '__main__.DataHolder'> 

рдпрд╣реА рд╣реИ, рдЕрдЧрд░ __dict__ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ __dict__ рдЖрд╡реГрддреНрддрд┐ рд╡рд░реНрдЧ (рдпрд╛ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ) рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдФрд░ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ - рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХред

рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБред рдпрджрд┐ рдЖрдк рдХреНрд▓рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдорд╛рди рдХреНрд▓рд╛рд╕ рдХреЗ __dict__ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдереА:

 DataHolder.__dict__ # {...'data': <__main__.DataDesc object at ...>...} DataHolder.data = "kick descriptor out" DataHolder.__dict__ # {...'data': 'kick descriptor out'...} DataHolder.data # "kick descriptor out" 


рдХреЛрдИ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирд╣реАрдВ

рдЧреИрд░-рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 class NonDataDesc: def __get__(self, obj, cls): print("Trying to access from {0} class {1}".format(obj, cls)) class NonDataHolder: non_data = NonDataDesc() n = NonDataHolder() NonDataHolder.non_data # Trying to access from None class <class '__main__.NonDataHolder'> n.non_data # Trying to access from <__main__.NonDataHolder object at ...> class <class '__main__.NonDataHolder'> n.non_data = 1 n.non_data # 1 n.__dict__ # {'non_data': 1} 

рдЙрдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред рдЬрдм non_data рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ __dict__ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ __dict__ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВрдбрд▓ рдЫреБрдкрд╛ рд░рд╣рд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг

рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдп рд╣реИ; рдЬрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрди рдЬрд╛рддреА рд╣реИрдВ (рдКрдкрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдирд╛ рд╣реИред рд╕рдВрдкрддреНрддрд┐ рд╕реЗ, рдореЗрд░рд╛ рдорддрд▓рдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ (рдЧреЗрдЯрд░реНрд╕, рд╕реЗрдЯрд░реНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдирд╛ рд╕рд░рд▓ рд╣реИ:

 class Descriptor: def __get__(self, obj, type): print("getter used") def __set__(self, obj, val): print("setter used") def __delete__(self, obj): print("deleter used") class MyClass: prop = Descriptor() 

рдпрд╛ рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдпрд╣ рдПрдХ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 class MyClass: def _getter(self): print("getter used") def _setter(self, val): print("setter used") def _deleter(self): print("deleter used") prop = property(_getter, _setter, _deleter, "doc string") 

рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ:

 m = MyClass() m.prop # getter used m.prop = 1 # setter used del(m.prop) # deleter used 

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

 class MySecondClass: prop = property() m2 = MySecondClass() m2.prop # AttributeError: unreadable attribute m2.prop = 1 # AttributeError: can't set attribute del(m2) # AttributeError: can't delete attribute 

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдпреЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
 class StaticAndClassMethodHolder: def _method(*args): print("_method called with ", args) static = staticmethod(_method) cls = classmethod(_method) s = StaticAndClassMethodHolder() s._method() # _method called with (<__main__.StaticAndClassMethodHolder object at ...>,) s.static() # _method called with () s.cls() # _method called with (<class '__main__.StaticAndClassMethodHolder'>,) 


__getattr __ (), __setattr __ (), __delattr __ () рдФрд░ __getattribute __ ()


рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдкрддреНрддрд┐ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпреЛрдВ ) рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИред рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ __getattr __ () , __setattr __ () , __delattr __ (), рдФрд░ __getattribute __ () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ ред рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

__getattr __ (рд╕реНрд╡, рдирд╛рдо) рдХреЛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рд╛рдорд╛рдиреНрдп рддрдВрддреНрд░ ( __dict__ рдЙрджрд╛рд╣рд░рдг, рд╡рд░реНрдЧ, рдЖрджрд┐) рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ:

 class SmartyPants: def __getattr__(self, attr): print("Yep, I know", attr) tellme = "It's a secret" smarty = SmartyPants() smarty.name = "Smartinius Smart" smarty.quicksort # Yep, I know quicksort smarty.python # Yep, I know python smarty.tellme # "It's a secret" smarty.name # "Smartinius Smart" 

рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп __getattribute __ (рд╕реНрд╡, рдирд╛рдо) рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рд▓реБрдХрдЕрдк рддрдВрддреНрд░ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, __len __ () , __str __ () ) рдпрд╛ рднрд╛рд╖рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирд┐рд╣рд┐рдд рдХреЙрд▓ __getattribute__ () рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

 class Optimist: attr = "class attribute" def __getattribute__(self, name): print("{0} is great!".format(name)) def __len__(self): print("__len__ is special") return 0 o = Optimist() o.instance_attr = "instance" o.attr # attr is great! o.dark_beer # dark_beer is great! o.instance_attr # instance_attr is great! o.__len__ # __len__ is great! len(o) # __len__ is special\n 0 

__setattr __ (рд╕реНрд╡, рдирд╛рдо, рдорд╛рди) рдХреЛ рдПрдХ рдЖрд╡реГрддреНрддрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред __Getattribute __ () рдХреЗ рд╕рдорд╛рди , рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИ, рддреЛ рдорд╛рдирдХ рдорд╛рди рд╕реЗрдЯрд┐рдВрдЧ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 class NoSetters: attr = "class attribute" def __setattr__(self, name, val): print("not setting {0}={1}".format(name,val)) no_setters = NoSetters() no_setters.a = 1 # not setting a=1 no_setters.attr = 1 # not setting attr=1 no_setters.__dict__ # {} no_setters.attr # "class attribute" no_setters.a # AttributeError 

__delattr __ (рд╕реНрд╡рдпрдВ, рдирд╛рдо) - __setattr __ () рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ __getattribute __ () , __setattr __ (), рдФрд░ __delattr __ () , рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 class GentleGuy: def __getattribute__(self, name): if name.endswith("_please"): return object.__getattribute__(self, name.replace("_please", "")) raise AttributeError("And the magic word!?") gentle = GentleGuy() gentle.coffee = "some coffee" gentle.coffee # AttributeError gentle.coffee_please # "some coffee" 


рдирдордХ


рддреЛ, рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ attrname рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
  1. рдпрджрд┐ a .__ рд╡рд░реНрдЧ __.__ рдЧреЗрдЯрдЕрдЯреНрд░реАрдмреНрдпреВрдЯ __ () рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
  2. рдпрджрд┐ attrname рдПрдХ рд╡рд┐рд╢реЗрд╖ (рдЕрдЬрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд) рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ __class__ рдпрд╛ __doc__ , рддреЛ рдЗрд╕рдХрд╛ рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
  3. рдпрд╣ attrname рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП .__ рд╡рд░реНрдЧ __.__ рдбрд┐рдХреНрдЯреНрд░реА рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ ред рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдорд╛рди рдПрдХ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рддреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ __get __ () рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреА рднреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
  4. рдпрджрд┐ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ .rrname рдирд╛рдо .__ рд╢реНрд░реБрддрд┐рдХрд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЙрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рд╡рд╣рд╛рдБ рдпрд╛ __dict__ рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд╡рд░рдгрдХ рдХреЗ __get __ () рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
  5. рдпрд╣ рдПрдХ .__ рд╡рд░реНрдЧ __.__ рдбрд┐рдХреНрдЯреНрд░реА рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ , рдЕрдЧрд░ рдЗрд╕рдореЗрдВ attrname рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ "рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░" рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ __get __ () рд╣реИ , рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб рдореМрдЬреВрдж рд╣реИ рдФрд░ рдХреЛрдИ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рднреА рдЦреЛрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред
  6. рдпрджрд┐ a .__ рд╡рд░реНрдЧ __.__ getattr __ () рд╡рд┐рдзрд┐ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕реА рдХреЛрдИ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдЧреБрдгрдХ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ Attrname рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
  1. рдпрджрд┐ a .__ рд╡рд░реНрдЧ __.__ setattr __ () рд╡рд┐рдзрд┐ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдпрд╣ рдПрдХ .__ рд╡рд░реНрдЧ __.__ рдбрд┐рдХреНрдЯреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ , рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рдПрдЯреНрд░реАрдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреА __set __ () рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рднреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
  3. Attrname рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ .__ рд╢реНрд░реБрдд__ рдореЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ ред


__slots__


рдЬреИрд╕рд╛ рдХрд┐ рдЧреБрдЗрдбреЛ рдиреЗ рдЕрдкрдиреА рдЕрдЬрдЧрд░ рдХрд╣рд╛рдиреА рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдирдИ рд╢реИрд▓реА рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
... рдореБрдЭреЗ рдбрд░ рдерд╛ рдХрд┐ рдХреНрд▓рд╛рд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдмреБрд░рд╛ рдЕрд╕рд░ рдкрдбрд╝реЗрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ __dict__ рд╡рд░реНрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╣реБрдИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ ...

рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рд╕реЗ рдирд┐рд░рд╛рд╢ рд╣реИрдВ, рддреЛ рдЕрдЬрдЧрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рджреЗрдЦрднрд╛рд▓ __slots__ рдХреЗ рд╕рд╛рде рд╣реБрдИ ред
__Slots__ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╡рд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдореЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо рдЕрдм рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ __dict__ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

 class Slotter: __slots__ = ["a", "b"] s = Slotter() s.__dict__ # AttributeError sc = 1 # AttributeError sa = 1 sa # 1 sb = 1 sb # 1 dir(s) # [ ... 'a', 'b' ... ] 

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЧреБрдЗрдбреЛ рдХреЗ рдбрд░ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛, рддрдм рддрдХ рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, __slots__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдИ рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реНрдореГрддрд┐ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдХреЗред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рднрд╛рд░реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рдореЗрдВ рд╡реЗ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдмреЛрдзрдЧрдореНрдп рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред рдпреЗ рддрдВрддреНрд░ рднрд╛рд╖рд╛ рдХреЗ рд▓рдЪреАрд▓реЗрдкрди рдХрд╛ рдЖрдзрд╛рд░ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдХрдИ рд╡рд┐рд░рд╛рд╕рдд, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдФрд░ рдЕрдиреНрдп рдЙрдкрд╣рд╛рд░ рднреА рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрд╛, рд╕рдордЭ рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЗрдорд╛рдиреА рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрд░реНрдХрд╕рдВрдЧрдд рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рджреИрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЖрдкрдХреЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рдРрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВред рдФрд░ рдЕрдм, рдЖрдкрдХреА рдЖрдБрдЦреЛрдВ рдореЗрдВ рдЖрдЧ рд▓рдЧрдиреЗ рдФрд░ рдкреЙрдЗрдВрдЯ рдореЗрдВ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде, рдЖрдк рдмрджрд▓рддреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдл, рд╕рдмрд╕реЗ рдкрдардиреАрдп рдФрд░ рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИрдВ! рдЦреИрд░, рдпрд╛ рдПрдХ рдЯрд┐рдкреНрдкрдгреАред

рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рдВрджрд░реНрдн

  1. рд╢рд▓рдн рдЪрддреБрд░реНрд╡реЗрджреАред рдкрд╛рдпрдерди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ
  2. рдЧреБрдЗрдбреЛ рд╡рд╛рди рд░реЛрд╕реБрдоред рдиреНрдпреВ-рд╕реНрдЯрд╛рдЗрд▓ рдХреНрд▓рд╛рд╕реЗрд╕ рдкрд░ рдЗрдирд╕рд╛рдЗрдб рд╕реНрдЯреЛрд░реА
  3. рдЕрдЬрдЧрд░ рдХрд╛ рдкреНрд░рд▓реЗрдЦрди
UPD: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЗрд░рди рд╕реЗ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ: рдкрд╛рдпрдерди рдбреЗрдЯрд╛ рдореЙрдбрд▓

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


All Articles