рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрддрд╛рдПрдВ рдХрд┐ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛ рдХреИрд╕реЗ рдХрд╣рд▓рд╛рддреЗ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ, рдЧреБрдгреЛрдВ, рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдФрд░ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕рд╣рд┐рдд рдХрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдКрдВрдЧрд╛ред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдордХрдХреНрд╖рддрд╛ рджреВрдВрдЧрд╛ред
рд╕реАрдЦрдирд╛ рдХрд┐ рдХреИрд╕реЗ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрдкрдХрд░рдг рдЦреЛрд▓реЗрдВрдЧреЗ, рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЕрдЬрдЧрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреА рд╕реБрдВрджрд░рддрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддрд╛ рд╣реИред
рдкрд░рд┐рдЪрдп рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ
рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдПрдХ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ (
рдЕрдВрдЧреНрд░реЗрдЬреА рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╡реНрдпрд╡рд╣рд╛рд░) рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЧреБрдг рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдПрдХ рдЬрд┐рд╕рдХрд╛ рдЕрднрд┐рдЧрдо рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ
__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
рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ:
- рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ
__getattribute__
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ
__getattribute__
рд╕реНрд╡рдд: рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЙрд▓ __getattribute__
рд░реЛрдХ __getattribute__
__getattribute__
рдХреЗрд╡рд▓ рдирдИ рд╢реИрд▓реА рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдВрджрд░ рдЙрдкрд▓рдмреНрдз рд╣реИobject.__getattribute__
рдФрд░ type.__getattribute__
рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓ рдХрд░реЗрдВ- рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣рдореЗрд╢рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЪрд░ рдкрд░ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддреЗ рд╣реИрдВ
- рдСрдмреНрдЬреЗрдХреНрдЯ рдЪрд░ рдХреЗ рдХрд╛рд░рдг рдХреЛрдИ рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдгрдХ рд▓рд╛рдн рдирд╣реАрдВ рдЦреЛ рд╕рдХрддрд╛ рд╣реИ
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']
рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдФрд░ рдЕрд╕рдВрдмрджреНрдз рддрд░реАрдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВред рднрд▓реЗ рд╣реА рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
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) |
staticmethod | f (* args) | f (* args) |
classmethod | f (рдкреНрд░рдХрд╛рд░ (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