
1.
рдкрд░рд┐рдЪрдп2.
рд╡рд╕реНрддреБрдПрдВред рд╕рд┐рд░3.
рд╡рд╕реНрддреБред рдкреВрдВрдЫ4.
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВрд╣рдо рдкрд╛рдпрдерди рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдХреЛ рд╕рдордЭрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдкрд╛рдпрдерди рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреИрд╕реЗ рдкрдЪрд╛рддрд╛ рд╣реИред рдЖрдЬ рд╣рдо рдЗрд╕рдХреА рд╡рд╕реНрддреБ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЙрдкрдХрд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВредрдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдПрдкрд┐рд╕реЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ (рдЬреЛ рд╕рдВрдпреЛрдЧрд╡рд╢ рд╕рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛; рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдореБрдЭреЗ рд╕рдЪрдореБрдЪ рдЪрд▓рддреА рд╣реИрдВ!) - рдЖрдЬ рдХреА рдкреЛрд╕реНрдЯ рдкрд╛рдЗрдерди 3.x рдореЗрдВ
рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред рдкрд╣рд▓реЗ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд╖рдп рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм рдореИрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝реЗ рдЧрдП рд╕рднреА рдХреЛрдб рдкрдврд╝рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо ... рдЙрдо, "рд╕рд░рд▓" (рдФрд░ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдореИрдВ рдФрд░ рднреА рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╖рдп рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЙрд╕реА рд╕рдордп, рдореБрдЭреЗ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдкрд░ рд╢рдХ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд╛рдпрдерди рджрд┐рдЧреНрдЧрдЬреЛрдВ рдХреЗ рдмреАрдЪ рднреА, рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВред рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдмрд╛рдХреА рд╕рдм рдЪреАрдЬрд╝реЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдЬрдм рдкрд╛рдпрдерди (рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рджреЗрдЦрд╛
./Python
рдФрд░ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛
./Objects
рдФрд░
./Include
)ред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдореБрдЭреЗ рдЖрд╕рд╛рди рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рдерд╛ред рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реА рдПрдкреАрдЖрдИ рдерд╛ред рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪрдирд╛ рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдЧрд╛: рдпрд╛рдж рд░рдЦреЗрдВ, рдпрд╣ рд╕рдм рдЗрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред
рдкрд╛рдпрдерди рдореЗрдВ рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ: рд╕рдВрдЦреНрдпрд╛, рд╢рдмреНрджрдХреЛрд╢, рдХрд╕реНрдЯрдо рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдХреНрд╖рд╛рдПрдВ, рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдФрд░ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдореЛрд░реА рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП, рдХрдо рд╕реЗ рдХрдо рджреЛ рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ
./Include/object.h
:
PyObject
:
typedef struct _object { Py_ssize_t ob_refcnt; struct _typeobject *ob_type; } PyObject;
рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпреЗ рджреЛ рдлрд╝реАрд▓реНрдб рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдФрд░
рдкреНрд░рдХрд╛рд░ (рд▓рд┐рдВрдХ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдбреАрдмрдЧ рдмрд┐рд▓реНрдб рдореЗрдВ рдХреБрдЫ рд░рд╣рд╕реНрдпрдордп рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ)ред
рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдмрд╛рд░ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рдПрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдб рдореЗрдВ
>>> a = b = c = object()
, рдПрдХ рдЦрд╛рд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ рд╕реЗ рд╢реБрд░реВ рдФрд░ рд╕рдВрдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
a
,
b
рдФрд░
c
ред рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд▓рд┐рдВрдХ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдирдП рдирд╛рдо рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рд╡рд╕реНрддреБ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдирдИ рдХрдбрд╝реА рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ! рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрднреА
рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╕реНрддреБ рдкреНрд░рдгрд╛рд▓реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдореИрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдмрддрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦреВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИ
./Include/object.h
:
Py_DECREF
, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдорд┐рд▓реЗ рдереЗ: рдпрд╣ рд╕рд┐рд░реНрдл
ob_refcnt
(рдФрд░ рдпрджрд┐
ob_refcnt
рд╢реВрдиреНрдп рдорд╛рди рд▓реЗрддрд╛ рд╣реИ) рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ ред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣
ob_type
рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ
рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ, рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХреА рдХреЗрдВрджреНрд░реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛ (рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ: рддреАрд╕рд░реЗ рдкрд╛рдпрдерди рдореЗрдВ,
рдкреНрд░рдХрд╛рд░ рдФрд░
рд╡рд░реНрдЧ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИрдВ;
рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрди рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ)ред рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЬреАрд╡рди рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ (рдкреНрд░рдХрд╛рд░ рдЕрддреНрдпрдВрдд рджреБрд░реНрд▓рдн рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдмрджрд▓рддреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╢рд╛рдпрдж рд╣реА рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВрдЧреЗ)ред рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░ (рдФрд░
рдХреЗрд╡рд▓ рд╡рд╕реНрддреБ
рдХрд╛ рдкреНрд░рдХрд╛рд░) рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рдмрд╛рдж рд╕реНрдкреЙрдЗрд▓рд░ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг)ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдШрдЯрд╛рд╡ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдСрдкрд░реЗрдВрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ (
PyNumber_Subtract
) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рднрд┐рдиреНрдирд╛рддреНрдордХ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреВрд░реНрдг рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рд╢рдмреНрджрдХреЛрд╖ рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдШрдЯрд╛рдирд╛ред
рдХреЛрдб рджрд┐рдЦрд╛рдПрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди
рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдПрдХ
void *
рд╕реВрдЪрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ
PyObject *
рд╕реВрдЪрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдкрд╛рд░рджрд░реНрд╢реА рднреА рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдЙрддреНрддрд░ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рднреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ (рдЗрд╕рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ; рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░ рдХрд╛
type
), рд▓реЗрдХрд┐рди рджреЛ рдореБрдЦреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рдЦреЗрддреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди
рдХрд░реЗрдВ ред рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рд╣реИ
./Include/object.h
:
PyTypeObject
ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд▓реЗрдЦ рдкрдврд╝рддреЗ рд╣реИрдВ, рдореИрдВ рдЙрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ
рд╕реНрд▓реЙрдЯреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдкрд╛рдпрдерди рд╕реА-рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдпрд╣ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
PyNumber_Subtract
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдСрдкрд░реЗрдВрдб рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрд╛рд╡ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, C-API рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдЬрдмрдХрд┐
TypeError
рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдирд╛ рднреА рдХрд╛рдо рд╣реИ)ред
рдЖрдЗрдП рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
PyNumber_Subtract
рджреЛ рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХрд╛рд░реНрдп рдХрд╣рддрд╛ рд╣реИ
./Objects/abstract.c
:
binary_op
, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ
nb_subtract
рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕реНрд▓реЙрдЯреНрд╕ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
sq_length
рд╕реЗ
sq_length
рд╕рдВрдЦреНрдпрд╛ рдпрд╛
sq_length
ред)
binary_op
рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ
binary_op1
рдкрд░ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ
binary_op1
, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
./Objects/abstract.c
:
binary_op1
(рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝реЗрдВ - рдпрд╣ рдЖрдкрдХреА рдЖрдВрдЦреЛрдВ рдХреЛ рдХрдИ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрд▓рддрд╛ рд╣реИ)
BINARY_SUBTRACT
рдСрдкрд░реЗрд╢рди рдХреЗ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ
v
рдФрд░
w
рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░
v->ob_type->tp_as_number
, рдПрдХ
рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ред
binary_op1
1 рдХреЛ
tp_as_number->nb_subtract
C рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдЬреЛ рдпрд╛ рддреЛ рдПрдХ рдШрдЯрд╛рд╡ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖
Py_NotImplemented
рдорд╛рди
Py_NotImplemented
рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдкрд░реЗрдВрдб рдПрдХ
Py_NotImplemented
рдФрд░ рдШрдЯрд╛рдП рдЧрдП рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рдВрдЧрдд рд╣реИ (рдпрд╣ рдПрдХ
TypeError
рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛)ред
рдпрджрд┐ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ C рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ
PyTypeObject
рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЛ рдЖрдкрдХреЗ рдЗрдЪреНрдЫрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рднрд░ рджреЗрдЧрд╛ред рдЬрдм рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рдирдП рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ (
>>> class Foo(list): pass
рдПрдХ рдирдпрд╛
рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ, рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рдЪреАрдЬ рд╣реИрдВ), рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрд▓реЙрдЯ рдХреЛ рдирд╣реАрдВ рднрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ? рдпрд╣ рд╕рд╣реА рд╣реИ, рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдХрд╛рд░рдг, рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬреИрд╕реЗ
list
рдФрд░
dict
ред рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рднрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдореНрдпреВрдЯреЗрд╢рди рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХреА рдХреБрдВрдЬреА рдХреА рдореИрдкрд┐рдВрдЧред рдЬрдм рдЖрдк рдкрд╛рдЗрдерди рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП (рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП) рдвреЗрд░ рдкрд░ рдПрдХ рдирдпрд╛ рд╕реА-рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕реНрд▓реЙрдЯреНрд╕ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ,
рдмреЗрд╕рд┐рдХ , рдЯрд╛рдЗрдк рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ,
рдХрд┐ рдЗрдирд╣реЗрд░рд┐рдЯрд┐рд╡ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛)
рдЕрдиреНрдп рдкреНрд░рдХрд░рдгреЛрдВ рдореЗрдВ )ред рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЙрдкреА рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдирдП рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдЙрдкрдкреНрд░рдХрд╛рд░ рдФрд░ рдмреЗрд╕рд┐рдХ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ, рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ -
object
(C рдореЗрдВ
PyBaseObject_Type
), рдЬрд┐рд╕рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рд╕реНрд▓реЙрдЯ рд╢реВрдиреНрдп рд╣реИрдВ, рдФрд░ рдЬрд┐рд╕реЗ рдХреБрдЫ рднреА
PyBaseObject_Type
рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдкрд╛рдпрдерди рдореЗрдВ
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛
рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЖрдк рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдФрд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ
object
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд╣реЛрдЧрд╛; рдкрд╛рдпрдерди 2.x рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ "рдХреНрд▓рд╛рд╕рд┐рдХ" рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛; , рд╣рдо рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рд▓рдЧрд╛рддрд╛рд░
рд╕рдм рдХреБрдЫ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдк рд╕реАрдзреЗ рдкрд╛рдпрдерди рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
Bar
рд╡рд░реНрдЧ рдкрд░ рдПрдХ
рд╡рд┐рд╢реЗрд╖ __call__ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд
рдХрд░рдХреЗ , рд╣рдордиреЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ
рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ред
рдХреБрдЫ, рдХрд╣реАрдВ рди рдХрд╣реАрдВ, рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рдпрд╣
__call__
рдкрджреНрдзрддрд┐ рдХреЛ рдиреЛрдЯрд┐рд╕
__call__
рд╣реИ рдФрд░ рдЗрд╕реЗ
tp_call
рд╕реНрд▓реЙрдЯ рд╕реЗ
tp_call
ред
./Objects/typeobject.c
:
type_new
- рдПрдХ рдЬрдЯрд┐рд▓, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп - рдпрд╣ рд╡рд╣ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рд╕рдм рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдЕрдЧрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗ, рдФрд░ рдЕрдм рд╣рдо рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдкрд░ рд▓рдЧрднрдЧ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рд╡рд╛рдкрд╕ рдЖрдП:
fixup_slot_dispatchers(type);
ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╛рдорд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпреЗ рддрд░реАрдХреЗ рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ?)ред
рдПрдХ рдФрд░
__call__
рдмрд┐рдВрджреБ:
__call__
рд╡рд┐рдзрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреИрд╕реЗ
__call__
рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ
рдмрд╛рдж рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ
__call__
рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡рд┐рдзрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдкрд╣рд▓реЗ
__call__
рдереЗ? рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓, рдореЗрд░реЗ рджреЛрд╕реНрддред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ (рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд┐рд░рджрд░реНрдж рд╣реИ, рддреЛ
>>> class Foo(list): pass ; type(Foo)
)ред рдЗрд╕рд▓рд┐рдП, рдЬрдм рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рд╡рд░реНрдЧ рдХреЗ рдмрдЬрд╛рдп рд╢рдмреНрдж
рдкреНрд░рдХрд╛рд░ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рдореЗрдВ "рдкреНрд░рдХрд╛рд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдВ), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЙрд▓, рдШрдЯрд╛рдирд╛ рдпрд╛ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ,
ob_type
рд╡рд╕реНрддреБ рдХрд╛
ob_type
рдХреНрд╖реЗрддреНрд░ рдХреЛ
ob_type
рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ
type
ред рдлрд┐рд░, рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
type->tp_setattro
рд╕реНрд▓реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп (рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдлреЗрд╕рдмреБрдХ рдкрд░ рдлреНрд░реАрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдкреГрд╖реНрда рд╣реИ --/
./Objects/typeobject.c
/
type_setattro
:
type_setattro
) рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди (
update_one_slot
) рдХреЛ
fixup_slot_dispatchers
рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
fixup_slot_dispatchers
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдирдпрд╛ рдЦреБрд▓рд╛рд╕рд╛ рд╣реБрдЖ!
рдпрд╣ рд╕рдВрднрд╡рддрдГ рдкрд╛рдпрдерди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрдп рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕реНрдерд╛рди рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдпрд╛рддреНрд░рд╛ рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЖрдк рдЕрднреА рднреА рдореЗрд░реЗ рд╕рд╛рде рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд▓рд┐рдЦрдирд╛ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЧрдпрд╛ (рдФрд░
#python-dev
рдкрд░ рд░рд╛рдд рдореЗрдВ рджреЗрд░ рд░рд╛рдд
рдПрдВрдЯреЛрдиреА рдкрд┐рдЯреНрд░реНрдпреВ рдФрд░
рдорд╛рд░реНрдХ рдбрд┐рдХрд┐рдиреНрд╕ рдХреА рдорджрдж рдХреЗ рдмрд┐рдирд╛ рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛!)ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рд╣реИрдВ: рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрд╢рди рдореЗрдВ рдХреМрди рд╕рд╛ рдСрдкрд░реЗрдВрдб рд╕реНрд▓реЙрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрди
рдЦреМрдлрдирд╛рдХ рд╕рдмрд╕реЗ рдирдиреНрд╣рд╛ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?
рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдФрд░
__slots__
рдФрд░
рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ ? рдПрдореНрдмреЗрдбреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рд╢рдмреНрджрдХреЛрд╢ ,
рд╕реВрдЪреА ,
рд╕реЗрдЯ рдФрд░ рдЙрдирдХреЗ рдЪрдЪреЗрд░реЗ рднрд╛рдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ? рдФрд░ рдЕрдВрдд рдореЗрдВ,
рдЗрд╕ рдЪрдорддреНрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
>>> a = object() >>> class C(object): pass ... >>> b = C() >>> a.foo = 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute 'foo' >>> b.foo = 5 >>>
рдЖрдк рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рдордирдорд╛рдирд╛ рдЧреБрдг рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд░реНрдЧ
C
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ
object
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛
object
, рдФрд░ рдЖрдк
a
рд╣реА, рдПрдХ рд╣реА
object
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЬреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рд╡реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ:
b
рдореЗрдВ
__dict__
, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рдБ рдпрд╣ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдирдпрд╛ (рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рддреБрдЪреНрдЫ!) рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ?
рд╣рд╛! рдореИрдВ рдРрд╕реЗ рд╕рд╡рд╛рд▓реЛрдВ рд╕реЗ рдмреЗрд╣рдж рдЦреБрд╢ рд╣реВрдБ! рдЙрддреНрддрд░
рд╣реЛрдВрдЧреЗ , рд▓реЗрдХрд┐рди рдЕрдЧрд▓реЗ рдПрдкрд┐рд╕реЛрдб рдореЗрдВред
рдЬрд┐рдЬреНрдЮрд╛рд╕реБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╣рд┐рддреНрдп рдХреА рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА:
- рдбреЗрдЯрд╛ рдореЙрдбрд▓ (рдмрд▓ рдХреЗ рдЦрд┐рд▓рд╛ рдкрдХреНрд╖) рдкрд░ рдкреНрд░рд▓реЗрдЦрди;
- рдЕрдореВрд░реНрдд рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБ (рдкрд╛рд╡рд░ рд╕рд╛рдЗрдб) рдкрд░ рд╕реА-рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди;
- descrintro , рдпрд╛ рдкрд╛рдпрдерди 2.2 рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХреАрдХрд░рдг , рдПрдХ рд▓рдВрдмрд╛, рдорд╕реНрддрд┐рд╖реНрдХ-рдЕрд╕рд░ рдФрд░ рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреБрд░рд╛рддрд╛рддреНрд╡рд┐рдХ рдЦреЛрдЬ рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдИрд╕реНрдЯрд░ рдЕрдВрдбреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐
>>> import THAT
) - рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдлрд╛рдЗрд▓ рд╣реИ
./Objects/typeobject.c
ред рдЗрд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдкрдврд╝реЗрдВ, рдЬрдм рддрдХ рдХрд┐ рдЖрдБрд╕реВ рдореЗрдВ рдЖрдк рдмрд┐рд╕реНрддрд░ рдкрд░ рди рдЧрд┐рд░ рдЬрд╛рдПрдВред
рдЕрдЪреНрдЫрд╛ рд╕рдкрдирд╛ рджреЗрдЦрд╛ред
рдпрд╛рдж рд░рдЦреЗрдВ! рд╣рдо рд╣рдореЗрд╢рд╛ рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдЦреБрд╢ рд╣реЛрддреЗ рд╣реИрдВ ред