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

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛


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

рд╕реАрдЦрдирд╛ рдХрд┐ рдХреИрд╕реЗ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрдкрдХрд░рдг рдЦреЛрд▓реЗрдВрдЧреЗ, рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЕрдЬрдЧрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреА рд╕реБрдВрджрд░рддрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддрд╛ рд╣реИред


рдкрд░рд┐рдЪрдп рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ


рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдПрдХ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ ( рдЕрдВрдЧреНрд░реЗрдЬреА рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╡реНрдпрд╡рд╣рд╛рд░) рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЧреБрдг рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдПрдХ рдЬрд┐рд╕рдХрд╛ рдЕрднрд┐рдЧрдо рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ __get__ , __set__ рдФрд░ __delete__ ред рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╡рд┐рд╡рд░рдгрдХ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ax рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдЦреЛрдЬ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрддреА рд╣реИ: a.__dict__['x'] , рдлрд┐рд░ type(a).__dict__['x'] рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП type(a).__dict__['x'] , рдФрд░ рдлрд┐рд░ type(a) рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рддрдХ type(a) рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рд╕рд╣рд┐рдд рдирд╣реАрдВред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдЬрдЧрд░ рдорд╛рдирдХ рдЦреЛрдЬ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдФрд░ рдХрдм рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рддрд░реАрдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдирдИ рд╢реИрд▓реА рдХреА рд╡рд╕реНрддреБрдУрдВ рдпрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рд╡рд░реНрдЧ рдПрдХ рд╣реИ рдпрджрд┐ рдпрд╣ object рдпрд╛ type рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ)ред

рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рджрд╛рдпрд░реЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИред рд╡реЗ рдЧреБрдг, рд╡рд┐рдзрд┐рдпреЛрдВ, рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ, рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ super() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкреАрдЫреЗ рдХрд╛ рддрдВрддреНрд░ рд╣реИрдВред рдЕрдЬрдЧрд░ рдХреЗ рдЕрдВрджрд░, рдЙрдирдХреА рдорджрдж рд╕реЗ, рдПрдХ рдирдИ рд╢реИрд▓реА рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрд╕реНрдХрд░рдг 2.2 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реА рдХреЛрдб рдХреА рд╕рдордЭ рдХреЛ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдЬрдЧрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд▓рдЪреАрд▓рд╛ рд╕реЗрдЯ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓


 descr.__get__(self, obj, type=None) -->  descr.__set__(self, obj, value) --> None descr.__delete__(self, obj) --> None 

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

рдпрджрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ __get__ рдФрд░ __set__ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдЬрд┐рдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ __get__ , рдЙрдиреНрд╣реЗрдВ рдЧреИрд░-рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЗрд╕рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╕рдВрднрд╡ рд╣реИрдВред

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

рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, __get__ рдФрд░ __set__ рджреЛрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдФрд░ __set__ рдХреЛ рдПрдХ __set__ рдЕрдкрд╡рд╛рдж __set__ ред __set__ рдкрджреНрдзрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдирд╛ рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ __set__ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдХреЙрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░


рд╡рд┐рд╡рд░рдгрдХ рдХреЛ рдЗрд╕рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, d.__get__(obj) ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреЙрд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, obj.d obj рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ d рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ d __get__ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ d.__get__(obj) рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреЙрд▓ рд╡рд┐рд╡рд░рдг рдХреНрдпрд╛ obj рд╕реЗ рдЕрд▓рдЧ рд╣реИ - рдПрдХ рд╡рд╕реНрддреБ рдпрд╛ рд╡рд░реНрдЧред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рдирдИ рд╢реИрд▓реА рдХреА рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╡рд░реНрдЧ рдПрдХ рдирдИ рд╢реИрд▓реА рдХреА рдХрдХреНрд╖рд╛ рд╣реИ рдпрджрд┐ рдпрд╣ object рд╡рдВрд╢рдЬ рд╣реИред

рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ object.__getattribute__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ bx рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ type(b).__dict__['x'].__get__(b, type(b)) рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ object.__getattribute__ type(b).__dict__['x'].__get__(b, type(b)) ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЪрд░ рдкрд░ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдЪрд░ рдЧреИрд░-рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдкрд░ рд╡рд░реАрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ __getattr__ рд╡рд┐рдзрд┐ рдХреА рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдкреВрд░реНрдг C рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди PyObject_GenericGetAttr() Objects/object.c рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо type.__getattribute__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ Bx рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ B.__dict__['x'].__get__(None, B) рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ B.__dict__['x'].__get__(None, B) ред рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 def __getattribute__(self, key): " type_getattro()  Objects/typeobject.c" v = object.__getattribute__(self, key) if hasattr(v, '__get__'): return v.__get__(None, self) return v 

рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ:
super() рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд▓реМрдЯреА рд╣реБрдИ рд╡рд╕реНрддреБ рдХрд╛ __getattribute__ рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд╣ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╣рддрд╛ рд╣реИред super(B, obj).m() рдХреЙрд▓ obj.__class__.__mro__ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ A obj.__class__.__mro__ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж B рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж A.__dict__['m'].__get__(obj, A) ред рдпрджрд┐ рдпрд╣ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ m рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд╛рдкрд╕ рдЖ m ред рдпрджрд┐ m рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо object.__getattribute__ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрдЬ рдкрд░ рд▓реМрдЯ object.__getattribute__ ред

рдиреЛрдЯ: python 2.2 рдореЗрдВ, super(B, obj).m() __get__ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдерд╛ред рдкрд╛рдЗрдерди 2.3 рдореЗрдВ, рдкреБрд░рд╛рдиреА рд╢реИрд▓реА рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг super_getattro() Objects/typeobject.c рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдореЗрдВ рд╕рдордХрдХреНрд╖ рдЧреБрдЗрдбреЛ рд╕реЗ рдореИрдиреБрдЕрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдКрдкрд░ рджрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдг рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ __getattribute__() рдЖрд╣реНрд╡рд╛рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо object , type рдФрд░ super рд▓рд┐рдП __getattribute__() рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╡реЗ object рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдРрд╕реА рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЗрд╕реА рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ, рддреЛ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрдХреНрд╖рд╛рдПрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВред рдЗрд╕ рддрд░рд╣, рдпрджрд┐ рд╡реЗ __getattribute__() рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдХреНрд╖рд╛рдПрдВ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЙрд▓ рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рд╕рдВрднрд╛рд▓реЗрдВ


рдирд┐рдореНрди рдХреЛрдб рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╡рд╕реНрддреБрдПрдВ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА рдХрд░рддреЗ рд╣реИрдВ рд╣рд░ рдХреЙрд▓ рдпрд╛ set рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред __getattribute__ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХреЗрд╡рд▓ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╡рд┐рд╡рд░рдгрдХ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
 class RevealAccess(object): """ ,     ,     ,     . """ def __init__(self, initval=None, name='var'): self.val = initval self.name = name def __get__(self, obj, objtype): print '', self.name return self.val def __set__(self, obj, val): print '' , self.name self.val = val >>> class MyClass(object): x = RevealAccess(10, 'var "x"') y = 5 >>> m = MyClass() >>> mx  var "x" 10 >>> mx = 20  var "x" >>> mx  var "x" 20 >>> my 5 

рдпрд╣ рд╕рд░рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд░реЛрдорд╛рдВрдЪрдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рддреЛ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЧреБрдг, рд╕рдВрдмрдВрдзрд┐рдд рдФрд░ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ, рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред

рдЧреБрдг


property() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП property() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ:
 property(fget=None, fset=None, fdel=None, doc=None) --> ,   

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ x рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП property() рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ property() рджрд┐рдЦрд╛рддрд╛ рд╣реИ:
 class C(object): def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x x = property(getx, setx, delx, "  'x'.") 

рдпрд╣рд╛рдВ рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдкрд░ property рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдХрд┐ рдХреИрд╕реЗ рд╡рд┐рд╡рд░рдгрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ property() рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИ:
 class Property(object): " PyProperty_Type()  Objects/descrobject.c" def __init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel self.__doc__ = doc def __get__(self, obj, objtype=None): if obj is None: return self if self.fget is None: raise AttributeError, " " return self.fget(obj) def __set__(self, obj, value): if self.fset is None: raise AttributeError, "   " self.fset(obj, value) def __delete__(self, obj): if self.fdel is None: raise AttributeError, "   " self.fdel(obj) 

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд property() рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди property() рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдерд╛ рдФрд░ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдП, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯ рд╡рд░реНрдЧ Cell('b10').value рдорд╛рдзреНрдпрдо рд╕реЗ Cell('b10').value рдорд╛рди рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдмрд╛рдж рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐ рд╕реЗрд▓ рдХреЗ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдорд╛рди рд╣рд░ рдмрд╛рд░ рдкреБрдирд░реНрдЧрдгрдирд╛ рд╣реЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред property() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ value рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 class Cell(object): . . . def getvalue(self, obj): "     " self.recalc() return obj._value value = property(getvalue) 

рдХрд╛рд░реНрдп рдФрд░ рддрд░реАрдХреЗ


рдЕрдЬрдЧрд░ рдореЗрдВ, рд╕рднреА рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдЧреИрд░-рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрджреГрд╢реНрдп рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрд▓рд╛рд╕ рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдердб рдХреЛ рдлрдВрдХреНрд╢рди рдХреЗ рддреМрд░ рдкрд░ рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИред рдХрд┐рд╕реА рдХрдХреНрд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, def рдФрд░ lambda рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡рд┐рдзрд┐рдпрд╛рдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрдкрдХрд░рдг рд╣реИрдВред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕ рддрд░реНрдХ рдХреЛ рдЖрдорддреМрд░ рдкрд░ self рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди this рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╢рдмреНрдж рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд░ рдирд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ __get__ рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ __get__ рд╣реИ, рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЧреИрд░-рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рдмрдирд╛рддреА рд╣реИред рдЗрд╕ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрд╛рдзреНрдп рдпрд╛ рдЕрд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд▓реМрдЯрддреЗ рд╣реИрдВред
 class Function(object): . . . def __get__(self, obj, objtype=None): " func_descr_get()  Objects/funcobject.c" return types.MethodType(self, obj, objtype) 

рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 >>> class D(object): def f(self, x): return x >>> d = D() >>> D.__dict__['f'] #     <function f at 0x00C45070> >>> Df #       <unbound method Df> >>> df #        <bound method Df of <__main__.D object at 0x00B18C90>> 

рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдФрд░ рдЕрд╕рдВрдмрджреНрдз рддрд░реАрдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВред рднрд▓реЗ рд╣реА рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, Objects/classobject.c рдореЗрдВ PyMethod_Type рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ im_self рдлрд╝реАрд▓реНрдб im_self рдорд╛рди рд╣реИ рдпрд╛ рдпрд╣ NULL (C рд╕рдорддреБрд▓реНрдп рд╣реИ) рдорд╛рди рдирд╣) рдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рдкреНрд░рднрд╛рд╡ im_self рдлрд╝реАрд▓реНрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд рд╡рд┐рдзрд┐ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ), рддреЛ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди ( im_func рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд) рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рдеред рдпрджрд┐ рдпрд╣ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рднреА рддрд░реНрдХ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред instancemethod_call() рд╡рд╛рд╕реНрддрд╡рд┐рдХ C рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреЗрдХ рдФрд░ рдЬреИрд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ


рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдПрдВред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ __get__ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдзрд┐рдпрд╛рдБ рдмрди рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИрдВред рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП obj.f(*args) рдХреЛ рдХреЙрд▓ рдХреЛ f(obj, *args) рдирд╣реАрдВ klass.f(*args) , рдФрд░ klass.f(*args) рдХреЛ рдХреЙрд▓ klass.f(*args) рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдмрдВрдзрди рдФрд░ рджреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИ:
рдкрд░рд┐рд╡рд░реНрддрдирдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИрдПрдХ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛
рд╡рд░реНрдгрдирдХрд░реНрддрд╛рд╕рдорд╛рд░реЛрд╣f (obj, * args)f (* args)
staticmethodf (* args)f (* args)
classmethodf (рдкреНрд░рдХрд╛рд░ (obj), * args)рдЪ (рдХреНрд▓реИрд╢, * рдЖрд░реНрдЧреНрд╕)

рд╕реНрдЯреЗрдЯрд┐рдХ рддрд░реАрдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред Cf рдпрд╛ Cf object.__getattribute__(c, "f") рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рдмрд░рд╛рдмрд░ Cf object.__getattribute__(c, "f") рдпрд╛ object.__getattribute__(C, "f") ред рдирддреАрдЬрддрди, рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдХреНрд▓рд╛рд╕ рджреЛрдиреЛрдВ рд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕реБрд▓рдн рд╣реИред

рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╡реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП self рдЪрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдкреИрдХреЗрдЬ рдореЗрдВ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрдЧ рдФрд╕рдд, рдЕрдкреЗрдХреНрд╖рд╛, рдордВрдЭрд▓рд╛ рдФрд░ рдЕрдиреНрдп рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдп рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдВ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, erf(x) рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рд╕реЗ рдФрд░ рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рджреЛрдиреЛрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: s.erf(1.5) --> 0.9332 рдпрд╛ Sample.erf(1.5) --> 0.9332 ред

рдЪреВрдВрдХрд┐ staticmethod() рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ:
 >>> class E(object): def f(x): print x f = staticmethod(f) >>> print Ef(3) 3 >>> print E().f(3) 3 

рдпрджрд┐ рдЖрдк рдЧреИрд░-рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╢реБрджреНрдз рдЕрдЬрдЧрд░ staticmethod() рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 class StaticMethod(object): " PyStaticMethod_Type()  Objects/funcobject.c" def __init__(self, f): self.f = f def __get__(self, obj, objtype=None): return self.f 

рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердбреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреНрд▓рд╛рд╕ рдореЗрдердб рдПрдХ рдХреНрд▓рд╛рд╕ рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗрддрд╛ рд╣реИред рдХреЙрд▓ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдХрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВред
 >>> class E(object): def f(klass, x): return klass.__name__, x f = classmethod(f) >>> print Ef(3) ('E', 3) >>> print E().f(3) ('E', 3) 

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдореЗрд╢рд╛ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред classmethod() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ рд╣реИред рдкрд╛рдЗрдерди 2.3 рдореЗрдВ, рдХреНрд▓рд╛рд╕ рдореЗрдердб dict.fromkeys() рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдПрдХ рдирдпрд╛ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рддрд╛ рд╣реИред рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдкрд░ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:
 class Dict: . . . def fromkeys(klass, iterable, value=None): " dict_fromkeys()  Objects/dictobject.c" d = klass() for key in iterable: d[key] = value return d fromkeys = classmethod(fromkeys) 

рдЕрдм рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рд╢рдмреНрджрдХреЛрд╢ рдЗрд╕ рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 >>> Dict.fromkeys('abracadabra') {'a': None, 'r': None, 'b': None, 'c': None, 'd': None} 

рдпрджрд┐ рдЖрдк рдЧреИрд░-рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢реБрджреНрдз рдкрд╛рдпрдерди classmethod() рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 class ClassMethod(object): " PyClassMethod_Type()  Objects/funcobject.c" def __init__(self, f): self.f = f def __get__(self, obj, klass=None): if klass is None: klass = type(obj) def newfunc(*args): return self.f(klass, *args) return newfunc 

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


All Articles