рдЕрдВрджрд░ рд╕реЗ рдмрд╛рд╣рд░ рдЕрдЬрдЧрд░ред рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ред рдкреВрдВрдЫ

1. рдкрд░рд┐рдЪрдп
2. рд╡рд╕реНрддреБред рд╕рд┐рд░
3. рд╡рд╕реНрддреБред рдкреВрдВрдЫ
4. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛: рд╣рдордиреЗ рд╕рдордЭрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдХреНрдпрд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдирд╛ рдХрд╛рдо рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

рдореИрдВ рдкрд╛рдпрдерди рдХреЗ рдЗрдирд╕рд╛рдЗрдб рдкрд░ рд╣рдорд╛рд░реЗ рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реВрдВ (рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдореИрдВ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ)ред рдЗрд╕ рдХрдбрд╝реА рдореЗрдВ, рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рдЕрднреА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рдкрд╛рдпрдерди рдореЗрдВ рдХреБрдЫ рднреА рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдг рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рдЕрдиреНрдп рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рдХрд┐ рд╕рдВрдЪрд╛рд▓рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИрдВ . (рдЕрд╡рдзрд┐), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: >>> my_object.attribute_name ред рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╕рдордп рдЕрдЬрдЧрд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реЗрдВред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реБрд▓рдн рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рдХреНрдпрд╛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ?)ред

рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде fixup_slot_dispatchers рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде, рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ... рдЖрдк рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдкрдврд╝рддреЗ рд╣реИрдВ , рдареАрдХ рд╣реИ?)ред рдпреЗ рддрд░реАрдХреЗ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЪрд╛рд╣реЗ рдЖрдк рд╕реА рдпрд╛ рдкрд╛рдпрдерди рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдХреБрдЫ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рднрдВрдбрд╛рд░ рд╕реЗ рд╕реНрдЯреЛрд░ рдФрд░ рд╡рд╛рдкрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЖрдИрдПрд╕рдПрд╕ рд╕реЗ рд░реЗрдбрд┐рдпреЛ рдкрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рднреЗрдЬ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд░рд┐рд▓реЗрд╢рдирд▓ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ред рд▓реЗрдХрд┐рди рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдХрд┐рд╕реА рдЧреБрдг рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЧреБрдг-рдорд╛рди рдпреБрдЧреНрдо (рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо / рдЧреБрдг рдорд╛рди) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рддрдм рд╕реЗрдЯ рдХрд░рддреА рд╣реИрдВ рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕ рд╢рдмреНрджрдХреЛрд╖ рд╕реЗ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрдм рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) AttributeError , рдпрджрд┐ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд░реВрдк рдХреБрдВрдЬреА рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рд╕рдм рдЗрддрдирд╛ рд╕рд░рд▓ рдФрд░ рд╕реБрдВрджрд░ рд╣реИ, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рд╢рд╛рдпрдж рдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред

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

рд╣рдо рдХреЛрдб рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ рдпрд╛ рддреБрд░рдВрдд рдкрд╛рда рд╡рд┐рд╡рд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:

 >>> print(object.__dict__) {'__ne__': <slot wrapper '__ne__' of 'object' objects>, ... , '__ge__': <slot wrapper '__ge__' of 'object' objects>} >>> object.__ne__ is object.__dict__['__ne__'] True >>> o = object() >>> o.__class__ <class 'object'> >>> oa = 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute 'a' >>> o.__dict__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute '__dict__' >>> class C: ... A = 1 ... >>> C.__dict__['A'] 1 >>> CA 1 >>> o2 = C() >>> o2.a = 1 >>> o2.__dict__ {'a': 1} >>> o2.__dict__['a2'] = 2 >>> o2.a2 2 >>> C.__dict__['A2'] = 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'dict_proxy' object does not support item assignment >>> C.A2 = 2 >>> C.__dict__['A2'] is C.A2 True >>> type(C.__dict__) is type(o2.__dict__) False >>> type(C.__dict__) <class 'dict_proxy'> >>> type(o2.__dict__) <class 'dict'> 

рдЗрд╕реЗ рдорд╛рдирд╡ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ: object (рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЕрдЧрд░ рдЖрдк рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ), рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИ, рдФрд░ рдЬреЛ рдХреБрдЫ рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рдЙрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо object.__dict__ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред object.__dict__ рдпрд╣ рд╣рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк object (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ o ) рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ __dict__ рдирд╣реАрдВ __dict__ , рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред o.__class__ , o.__hash__ , рдЖрджрд┐) рдпреЗ рдЖрджреЗрд╢ рдХреБрдЫ рд╣реИрдВ; рдлрд┐рд░ рд╡рд╛рдкрд╕ )ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдПрдХ рдирдпрд╛ C рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛, рдЬреЛ рдЙрд╕реЗ object рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛, A рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛, рдФрд░ рдпрд╣ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ CA рдФрд░ C.__dict__['A'] рдореЗрдВ рд╕реБрд▓рдн рд╣реИред C.__dict__['A'] , рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛ред рддрдм рд╣рдордиреЗ рдХрдХреНрд╖рд╛ C рдХрд╛ рдПрдХ o2 рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдФрд░ рджреЗрдЦрд╛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ __dict__ рдмрджрд▓ __dict__ , рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, __dict__ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреА рд╣реИрдВред рдмрд╛рдж рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ __dict__ рд╡рд░реНрдЧ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ ( C.A2 ) рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ ред рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╡рд░реНрдЧ рдХреЗ __dict__ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ - рдкрд░рд┐рдЪрд┐рдд dict_proxy рдФрд░ рд░рд╣рд╕реНрдпрдордп рдврдВрдЧ рд╕реЗ dict_proxy ред рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╕рдм рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд╕реЗ рдкрд╣реЗрд▓реА рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ: рдпрджрд┐ рд╢реБрджреНрдз object рдХреЗ рд╡рдВрд╢рдЬ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, o ) рдХреЗ рдкрд╛рд╕ __dict__ рдирд╣реАрдВ рд╣реИ, рдФрд░ C рдмрд┐рдирд╛ рдХрд┐рд╕реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ object рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ , рддреЛ __dict__ рдХрдХреНрд╖рд╛ рд╡рд░реНрдЧ ( o2 ) рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдХрд╣рд╛рдБ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ ?

рд╣рд╛рдБ, рдпрд╣ рдЕрдЬреАрдм рдФрд░ рдЕрдЬреАрдм рд╣реИ! рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рд╕рдордп рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, __dict__ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк PyTypeObject рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ PyTypeObject (рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ!), рддреЛ рдЖрдк tp_dict рд╕реНрд▓реЙрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕реВрдЪрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ рд╕реНрд▓реЙрдЯ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдЖрдк рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ ./Objects/typeobject.c : PyType_Ready , рдЬреЛ рдпрд╛ рддреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( Py_Initialize рдпрд╛рдж Py_Initialize ! рдпрд╣ рдлрд╝рдВрдХреНрд╢рди _Py_ReadyTypes рдХреЙрд▓ _Py_ReadyTypes , рдЬреЛ рд╕рднреА рдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП PyType_Ready рдХреЛ рдХреЙрд▓ PyType_Ready , рдпрд╛ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рдирдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ) рдкреНрд░рддреНрдпреЗрдХ рдирд╡рдЬрд╛рдд рд╢рд┐рд╢реБ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреА рд╡рд╛рдкрд╕реА рд╕реЗ рдкрд╣рд▓реЗ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ class рдХрдерди рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдо __dict__ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ __dict__ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ (рдкрдВрдХреНрддрд┐ ./Objects/typeobject.c : type_new : type->tp_dict = dict = PyDict_Copy(dict); рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ - type , рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕реНрд▓реЙрдЯ рд╣реИрдВ рдЬреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдЙрд╕ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рд╕ рд╣реИрдВ рдФрд░ tp_dict рдЕрдВрдХ рдХреЛ рд╕реНрдЯреЛрд░ / рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдХред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯрд╛рдЗрдк type рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд┐рдЬреА рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдк рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 class Foo: bar = "baz" print(Foo.bar) 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХреЙрд▓ рджрд┐рдЦрд╛рддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, bar рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, Foo рд╡рд░реНрдЧ ( tp_getattro рджреНрд╡рд╛рд░рд╛ tp_getattro ) рдХрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХреНрд╕реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдпрд╣реА рдмрд╛рдд рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ (рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рд╡реИрд╕реЗ, "рд╣рдЯрд╛рдирд╛" рдХреЗрд╡рд▓ рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛ NULL )ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмреАрдЪ рд╣рдордиреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИред

рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓реНрдкрдЬреНрдЮрд╛рдд (рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг!) рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВ: рдПрдХ рд╡рд┐рд╡рд░рдгрдХ ред рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдпрд╛ рджреЛ рд╕реНрд▓реЙрдЯ ( tp_descr_get рдФрд░ / рдпрд╛ tp_descr_set ) tp_descr_set рдорд╛рдиреЛрдВ рд╕реЗ рднрд░реЗ рд╣реЛрддреЗ рд╣реИрдВред рдпреЗ рд╕реНрд▓реЙрдЯ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ __get__ , __set__ рдФрд░ __delete__ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк __get__ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ tp_descr_get рд╕реНрд▓реЙрдЯ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛, рддреЛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реЛрдЧрд╛)ред рдЕрдВрдд рдореЗрдВ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ tp_descr_set рд╕реНрд▓реЙрдЯ tp_descr_set рдорд╛рди рд╕реЗ рднрд░рд╛ рд╣реЛред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ, рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рд▓рд┐рдВрдХ рджреВрдВрдЧрд╛ред

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

  1. рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЦреЛрдЬреЗрдВред рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ tp_descr_get рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВред рдпрджрд┐ рдХреБрдЫ рдФрд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕ рдирд╛рдо рдХреЗ рддрд╣рдд)ред
  2. рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЦреЛрдЬреЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рдиреЗ рдкрд░ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред
  3. рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛, рддреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рдПрдХреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ; рдпрджрд┐ X рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ tp_descr_get рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВред рдпрджрд┐ X рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред
  4. рдЕрдВрдд рдореЗрдВ, рдЕрдЧрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рдПрдХ AttributeError рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдВред

рдЕрдм рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛ рдЧреБрдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛рдиреА рдЬрдм рдЖрдк foo = oa рдпрд╛ oa = foo рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛ рдкрд╛рдпрдерди рдХреЗ рдХреБрдЫ "рдЬрд╛рджреВ" рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд░реАрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрд▓рд╛рд╕ C o рдСрдмреНрдЬреЗрдХреНрдЯ o C , рдХреНрд▓рд╛рд╕ C рдореЗрдВ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ foo , рдФрд░ o рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ foo , рддреЛ рдЬрдм o.foo рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ o.foo рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд┐рд╡рд░рдгрдХ рд▓реМрдЯрд╛рдПрдЧрд╛)ред рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдХреИрд╕реЗ рдкрдврд╝реЗрдВред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдВрдХ ("рдХреНрдпрд╛") рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ - рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╣рд▓реЗ рддреЛ рд▓реЗрдЦрди рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рд╛рд╡рдзрд╛рди рдФрд░ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдореЗрд░реА рдмрд╛рдд рд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдЫреЛрдЯрд╛ рд╣реИред рдЖрдкрдХреЛ рд░реЗрдордВрдб рд╣реЗрдЯрд┐рдВрдЧрд░ рдХреЗ рднрдпрд╛рдирдХ рд▓реЗрдЦ рдХреЛ рднреА рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд╛рдпрдерди 2.x рдореЗрдВ рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ ; рдЕрд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЗрдЦ рдЕрднреА рднреА рд╕рдВрд╕реНрдХрд░рдг 3.x рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реВрдЪреАрдмрджреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрдиреЗ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рд╕рдорд░реНрдкрд┐рдд рдХрд░реЗрдВред рдпрд╣рд╛рдБ, рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдм рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ( рдмрд╣реБрдд рд╕рд░рд▓) рджреВрдВрдЧрд╛:

 >>> class ShoutingInteger(int): ... # __get__   tp_descr_get ... def __get__(self, instance, owner): ... print('I was gotten from %s (instance of %s)' ... % (instance, owner)) ... return self ... >>> class Foo: ... Shouting42 = ShoutingInteger(42) ... >>> foo = Foo() >>> 100 - foo.Shouting42 I was gotten from <__main__.Foo object at 0xb7583c8c> (instance of <class __main__.'foo'>) 58 # :     ! >>> foo.Silent666 = ShoutingInteger(666) >>> 100 - foo.Silent666 -566 >>> 

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдордиреЗ рдкрд╛рдпрдерди рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреА рдкреВрд░реА рд╕рдордЭ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИ: рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рднреА рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХрдХреНрд╖рд╛ C1 A рдСрдмреНрдЬреЗрдХреНрдЯ O рд╡рд┐рд╢реЗрд╖рддрд╛ A рддрдХ рдкрд╣реБрдБрдЪрдирд╛, рдЬреЛ C2 рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ C3 рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, O рдФрд░ C1 рджреЛрдиреЛрдВ рд╕реЗ A рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ C2 рдФрд░ C3 , рдЬреЛ рд╡рд┐рдзрд┐ рд╕рдВрдХрд▓реНрдк рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рд╕реНрд▓реЙрдЯ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рдкрд╛рдпрдерди рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рдВрд╢рд╛рдЧрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢реИрддрд╛рди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реИ)ред

рд╣рдордиреЗ рдЖрдЬ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА PyObject рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдЦреА рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╛рди рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдВрдХреЗрддрдХ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХрд╣рд╛рдБ? рдЙрддреНрддрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рд╕реЗ PyTypeObject рдХреЛ PyTypeObject (рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╢рдЧрд▓ рд╣реИ! рджреИрдирд┐рдХ рдкрдврд╝реЗрдВ!), рдЖрдкрдХреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ tp_dictoffset рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕реА-рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдмрд╛рдЗрдЯ рдСрдлрд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЗрд╕ рдСрдлрд╕реЗрдЯ рдкрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рдкрд╛рдпрдерди рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╕рдордп, рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдореГрддрд┐ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рдпрд╣ рдЖрдХрд╛рд░ рд╢реБрджреНрдз PyObject рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд (рдЖрдорддреМрд░ рдкрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рд╕рдм рдЗрд╕рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред ./Objects/typeobject.c : type_new , рд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ may_add_dict = base->tp_dictoffset == 0; )ред gdb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рд╕реНрдерд╛рди рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рдЬреА рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 >>> class C: pass ... >>> o = C() >>> o.foo = 'bar' >>> o <__main__.C object at 0x846b06c> >>> #   GDB Program received signal SIGTRAP, Trace/breakpoint trap. 0x0012d422 in __kernel_vsyscall () (gdb) p ((PyObject *)(0x846b06c))->ob_type->tp_dictoffset $1 = 16 (gdb) p *((PyObject **)(((char *)0x846b06c)+16)) $3 = {u'foo': u'bar'} (gdb) 

рд╣рдордиреЗ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ ( o.foo = 'bar' ) рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА, gdb рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛, рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ ( C ) рдХреЛ dereferenced рдФрд░ рдЗрд╕реЗ tp_dictoffset (16) рдкрд╛рдпрд╛, рдФрд░ рдлрд┐рд░ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдЗрд╕ рдСрдлрд╕реЗрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рд╡рд╕реНрддреБ рдХреА рд╕реА-рд╕рдВрд░рдЪрдирд╛ред рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд╣рдордиреЗ рдПрдХ рдкреНрд░рдореБрдЦ foo рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд╢рдмреНрджрдХреЛрд╢ рдкрд╛рдпрд╛, рдЬреЛ bar рдХреЗ рдореВрд▓реНрдп рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдЧрд░ рд╣рдо tp_dictoffset рдкреНрд░рдХрд╛рд░ рдХреЗ tp_dictoffset рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, tp_dictoffset рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, object , рд╣рдо рд╡рд╣рд╛рдВ рд╢реВрдиреНрдп рдкрд╛рддреЗ рд╣реИрдВред Goosebumps, рд╣реБрд╣?

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдФрд░ рд░рд╣рд╕реНрдп рдмрдиреЗ рд╣реБрдП рд╣реИрдВред рдЖрдЗрдП рд╕рдВрдХреНрд╖реЗрдк рдХрд░реЗрдВ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЪреВрдХ рдЧрдП: рд╣рдо рдПрдХ рдЦрд╛рд▓реА рд╡рд░реНрдЧ C рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ object рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЗрд╕ рд╡рд░реНрдЧ o рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ o рдмрдирд╛рдПрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреЛ рдСрдлрд╕реЗрдЯ tp_dictoffset рджреНрд╡рд╛рд░рд╛ рдбрд┐рдХреНрд╢рдирд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕реНрдерд╛рди рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рдмреНрджрдХреЛрд╢ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ (рдХрд┐рд╕реА рднреА) рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╕рдВрднрд╛рд▓рдирд╛, рдпрд╣рд╛рдБ рдмрджрдорд╛рд╢ рд╣реИрдВ ...)ред рддрдм рд╣рдо o.__dict__ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд o.__dict__ , LOAD_ATTR рдХреЛ LOAD_ATTR рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ PyObject_GetAttr рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ o dereferens рдХрд░рддрд╛ рд╣реИ рдФрд░ tp_getattro рд╕реНрд▓реЙрдЯ рдХреЛ рдвреВрдБрдврддрд╛ рд╣реИ, рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЦреЛрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ PyObject_GenericGetAttr ред рдирддреАрдЬрддрди, рдпрд╣ рд╕рдм рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХрд╛ рд╢рдмреНрджрдХреЛрд╢ рдХреНрдпрд╛ рд╣реИ? рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рдХреНрд╢рдирд░реА рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ __dict__ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд┐рдХрди рдФрд░ рдЕрдВрдбреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: рдЬрдм рд╣рдо рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ рддреЛ рдбрд┐рдХреНрд╢рдирд░реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдХреИрд╕реЗ __dict__ рд╣реИ?

рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдкрд░ рдкреВрд░реНрд╡рддрд╛ рдмрд░рддрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬ рдПрдХ рд╕рдВрднрд╛рд▓ рд╣реИред рджреЗрдЦреЗрдВ:

 >>> class C: pass ... >>> o = C() >>> o.__dict__ {} >>> C.__dict__['__dict__'] <attribute '__dict__' of 'C' objects> >>> type(C.__dict__['__dict__']) <class 'getset_descriptor'> >>> C.__dict__['__dict__'].__get__(o, C) {} >>> C.__dict__['__dict__'].__get__(o, C) is o.__dict__ True >>> 

рд╡рд╛рд╣! рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ getset_descriptor (file ./Objects/typeobject.c ) рдирд╛рдордХ рдХреБрдЫ рдХрд╛рд░реНрдп, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рд╣реИ рдЬреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреЛ __dict__ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ o.__dict__ рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд╕рднреА рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ o рдореЗрдВ рдСрдлрд╕реЗрдЯ tp_dictoffset рджреНрд╡рд╛рд░рд╛ рдбрд┐рдХреНрд╢рдирд░реА рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрдЧрд╛ред рдЗрд╕рд╕реЗ рдпрд╣ рднреА рдкрддрд╛ dict_proxy рдХрд┐ рд╣рдордиреЗ рдереЛрдбрд╝реА рджреЗрд░ рдкрд╣рд▓реЗ dict_proxy рдХреНрдпреЛрдВ рдХреАред рдпрджрд┐ tp_dict рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рдРрд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рдХреНрдпреЛрдВ tp_dict рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рд▓рд┐рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ? рдпрд╣ __dict__ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВрдбрд▓ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред

 >>> type(C) <class 'type'> >>> type(C).__dict__['__dict__'] <attribute '__dict__' of 'type' objects> >>> type(C).__dict__['__dict__'].__get__(C, type) <dict_proxy object at 0xb767e494> 

рдпрд╣ рд╣реИрдВрдбрд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред __dict__ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЛ рд░реЛрдХрдирд╛ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП __sub__ ред рдЬрдм рд╣рдо рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдпрд╛ рдЬрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ update_one_slot рдлрд╝рдВрдХреНрд╢рди update_one_slot , рдЬреЛ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд░ рд╕реНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдШрдЯрд╛рд╡ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╣реБрдЖ рдерд╛ред рдпрджрд┐ рд╣рдо рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реАрдзреЗ __dict__ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдФрд░ рд╣рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ __sub__ рд╣реИ), рд▓реЗрдХрд┐рди рдЬреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ ред

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

рдЬрд╛рдирддреЗ рд╣реЛ рдХреНрдпрд╛? рд╕рд┐рд░реНрдл рд▓рдбрд╝рдХрд┐рдпрд╛рдВ рд╣реА рдирд╣реАрдВред рд╣рдо рднреА рдЗрди рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЖрдУ рдФрд░ рд╕рд╛рде рдореЗрдВ рдорд╕реНрддреА рдХрд░реЛред

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


All Articles