рдЕрдЬрдЧрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдиреЛрдЯреЛрдВ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ (рдкрд╣рд▓рд╛ рднрд╛рдЧ
рдпрд╣рд╛рдВ рд╣реИ )ред рдпрд╣ рд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕, рдЯрд╛рдЗрдк, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдХреИрд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИред
рдХрдХреНрд╖рд╛рдПрдВ
рдХрдХреНрд╖рд╛рдПрдВ (рдкреНрд░рдХрд╛рд░) рд╡рд╕реНрддреБ рдХрд╛рд░рдЦрд╛рдиреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рдирд╛ рд╣реИред
рдХрдХреНрд╖рд╛рдПрдВ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ (рдЬреЛ рдХрд┐ __dict__ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ): рд╡рд┐рдзрд┐рдпрд╛рдБ, рдЧреБрдг, рд╡рд░реНрдЧ рдЪрд░, рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдореВрд▓ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдХреЛ 2 рдЪрд░рдгреЛрдВ рдореЗрдВ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкрд╣рд▓рд╛, рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдлрд┐рд░ рдЖрд░рдВрднреАрдХрд░рдгред рддрджрдиреБрд╕рд╛рд░, __new__ рдХреНрд▓рд╛рд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ __in__ рдХреНрд▓рд╛рд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред
def __new __ (cls, ...) рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рд╣реИ (рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреЗ cls рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
def __init __ (рд╕реНрд╡, ...) рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
>>> class A ( object ):
... pass
...
>>>
рд╡рд░реНрдЧ A рдХреЗ рд▓рд┐рдП, рди рддреЛ __new__ рдФрд░ рди рд╣реА __in__ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд╡рд░реНрдЧ (рдкреНрд░рдХрд╛рд░) рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреЛ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рдХрдХреНрд╖рд╛ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ __dict__ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рд╡рд╣
рдЕрдкрдиреЗ рдмреЗрд╕ (рдорд╛рддрд╛-рдкрд┐рддрд╛) рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ __dict__ рдореЗрдВ рдЗрди рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧреАред
рдХреНрд▓рд╛рд╕ рдП рдореЗрдВ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рд╡рд╕реНрддреБ рдореЗрдВ рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред
рдФрд░ рдорд┐рд▓реЗрдЧрд╛:
>>> object . __dict__[ '__init__' ]
<slot wrapper '__init__' of 'object' objects>
>>> object . __dict__[ '__new__' ]
<built-in method __new__ of type object at 0x82e780>
>>>
рдЪреВрдВрдХрд┐ рдРрд╕реА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ a = A () рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рдорд╛рди рд╣реИ:
a = рдСрдмреНрдЬреЗрдХреНрдЯ .__ рдирдпрд╛ __ (рдП)
рдСрдмреНрдЬреЗрдХреНрдЯ .__ init __ (рдП)
рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реБрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ [1]:
a = рд╕реБрдкрд░ (A, A) .__ рдирдпрд╛ __ (A)
рд╕реБрдкрд░ (A, A) .__ init __ (a)
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
>>> class A ( object ):
... def __new__ (cls):
... obj = super (A, cls) . __new__(cls)
... print 'created object' , obj
... return obj
... def __init__ ( self ):
... print 'initing object' , self
...
>>> A()
created object <__main__.A object at 0x1620ed0>
initing object <__main__.A object at 0x1620ed0>
<__main__.A object at 0x1620ed0>
>>>
рд╕рд┐рдВрдЧрд▓рдЯрди vред рез
рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЖрдк рдЕрдХреЗрд▓реЗ рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рд╣реЛред рдпрд╛рдиреА рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╣рдореЗрд╢рд╛ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред
рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдЖрдк __new__ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рд╣рд░ рдмрд╛рд░ рдЙрд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рд╕реНрд╡рдпрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧ рдЪрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВред
рдирддреАрдЬрддрди, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
>>> class C ( object ):
... instance = None
... def __new__ (cls):
... if cls . instance is None :
... cls . instance = super (C, cls) . __new__(cls)
... return cls . instance
...
>>> C() is C()
True
>>> C() . x = 1
>>> c = C()
>>> d = C()
>>> c . x
1
>>> d . x
1
>>> c . x =2
>>> d . x
2
>>> c . x
2
рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ред
рдПрдХ рд╡рд░реНрдЧ (рдкреНрд░рдХрд╛рд░) рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ (рдкреНрд░рдХрд╛рд░) рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рдпрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рддрд░рд╣ рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдирд╛, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
XClass = XMetaClass (рдирд╛рдо, рдЖрдзрд╛рд░, рдЕрдЯреНрд░реНрд╕)
рдлрд┐рд░, рдмрдирд╛рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж
XClass .__ name__ рдирд╛рдо рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ,
XClass .__ bases__ рдЖрдзрд╛рд░реЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ,
рдПрдХреНрд╕рдХреНрд▓рд╛рд╕ .__ рдбрд┐рдХреНрдЯрд┐рдЬреА, рдПрдЯреНрд░рд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░
XClass .__ class__, XMetaClass рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореЗрдЯрд╛рдХреНрд▓рд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЗрд╕ рддрд░рд╣ рд╕реЗред
>>> class A ( object ):
... pass
...
рд╕рдорд╛рди рд░реВрдк рд╕реЗ, рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛:
>>> type ( 'A' , ( object ,), {})
<class '__main__.A'>
рдФрд░ рдпрд╣:
>>> class B (A):
... def foo ( self ):
... 42
...
рд╕рдорддреБрд▓реНрдп рд░реВрдк
>>> type ( 'B' , (A,), { 'foo' : lambda self : 42 })
рдХрдХреНрд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЕрдкрдиреЗ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╡рд░реНрдЧ рдЪрд░ __metaclass__:
>>> class A ( object ):
... __metaclass__ = Meta
...
>>>
рдЬреЛ рд╕рдорддреБрд▓реНрдп рд╣реИ: рдП = рдореЗрдЯрд╛ ('рдП', (рдСрдмреНрдЬреЗрдХреНрдЯ), {})
рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд╕реНрддреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рдХрд╛рд░ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рдФрд░, рд╕рднреА рд╕рднреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреА рддрд░рд╣, рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рд╣реИрдВ __class__ рдФрд░ __dict__:
>>> object . __class__
<type 'type'>
>>> type . __class__
<type 'type'>
>>> object . __dict__
<dictproxy object at 0x7f7797a1cf30>
>>> type . __dict__
<dictproxy object at 0x7f7797a1cfa0>
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╕реНрддреБ рдФрд░ рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдХрдХреНрд╖рд╛рдПрдВ) рд╣реИрдВ, рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ __name__, __bases___ рднреА рд╣реИрдВ:
>>> object . __name__
'object'
>>> type . __name__
'type'
>>> object . __bases__
()
>>> type . __bases__
(<type 'object'>,)
>>>
рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдХреЛрдИ рднреА) рд╣реИрдВред рдпрд╛рдиреА рдХреЛрдИ рднреА рд╡рд╕реНрддреБ рд╡рд╕реНрддреБ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
>>> isinstance ( 1 , object )
True
>>> isinstance ( setattr , object )
True
>>> isinstance ( "foo" , object )
True
>>> isinstance (A, object )
True
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ:
>>> def bar ():
... pass
...
>>> isinstance (bar, object )
True
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рд╣реА рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
>>> isinstance ( object , object )
True
рдкреНрд░рдХрд╛рд░ рднреА рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
>>> isinstance ( type , object )
True
рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ - рд╡рд╕реНрддреБ () рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИ:
>>> o = object ()
рдЬрд┐рд╕рдореЗрдВ __dict__ рднреА рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ __class__ рд╣реИред
>>> o . __dict__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'
>>> o . __class__
<type 'object'>
>>>
рдПрдХ рд╡рд░реНрдЧ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕рд┐рд░реНрдл рдЕрдиреНрдп рд╡рд░реНрдЧ рдпрд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ
>>> isinstance ( 1 , type )
False
рд╕реНрдЯреНрд░рд┐рдВрдЧ рднреА
>>> isinstance ( "foo" , type )
False
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЗрдЯрдЯреНрд░рд╛ рдлрд╝рдВрдХреНрд╢рди рднреА рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИред
>>> isinstance ( setattr , type )
False
рдПрдХ рд╡рд░реНрдЧ рдПрдХ рд╡рд░реНрдЧ рд╣реИред
>>> isinstance (A, type )
True
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╡рд░реНрдЧ рд╣реИред
>>> isinstance ( "foo" . __class__, type )
True
рдХреНрдпреЛрдВрдХрд┐ рд╡рд╕реНрддреБ рдФрд░ рдкреНрд░рдХрд╛рд░ рднреА рд╡рд░реНрдЧ рд╣реИрдВ, рдлрд┐рд░ рд╡реЗ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
>>> isinstance ( object , type )
True
>>> isinstance ( type , type )
True
>>>
рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдХрдИ рд╡рд░реНрдЧ (рдкреНрд░рдХрд╛рд░) рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдЙрдкрд╕рдореВрд╣ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рд╣реИ, рдЕрд░реНрдерд╛рддред
>>> issubclass ( type , object )
True
>>> issubclass ( object , type )
False
рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдиреНрдп рд╡рд░реНрдЧ рд╣реИрдВред (рдЕрд░реНрдерд╛рдд рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕)ред рдФрд░ рд╕реНрд╡рдпрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╕рд░рд▓, рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдХреНрд▓рд╛рд╕ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдкрд░, рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдФрд░ рдЬрдм рд╣рдо рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рднреА рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд▓реЗ рд▓реЗрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЬреЛ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ рд╡рд╣ рд╡рд░реНрдЧ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╣рд▓рд╛рддрд╛ рд╣реИред
рддреЛ, рдмрд╕ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рд╣рдо рдЗрд╕реЗ рдЯрд╛рдЗрдк рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред
рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд: рдкреНрд░рдХрд╛рд░ (рдП) рдФрд░ рдкреНрд░рдХрд╛рд░ (рдирд╛рдо, рдЖрдзрд╛рд░, рдЕрдЯрд╛рд░) рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВред
рдкреНрд░рдХрд╛рд░ (рдП) - рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрд▓, рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ,
рдПрдХ рдкреНрд░рдХрд╛рд░ (рдирд╛рдо, рдЖрдзрд╛рд░, рдЕрдЯреНрд░реНрд╕) - рддреАрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрд▓ - рдпрд╣ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИред
рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЧреБрдг рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдирд┐рдпрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ (рдХрдХреНрд╖рд╛рдПрдВ) рдореЗрдВ __bases__ - рдореВрд▓ рдХрдХреНрд╖рд╛рдПрдВ (рдкреНрд░рдХрд╛рд░) рд╣реИрдВред
рдпрджрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ __dict__ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ __bases__ рд╕реЗ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ рдПрдХ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж __dict__ __class __ 'a (рдпрд╛рдиреА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдореЗрдЯрд╛рдХреНрд▓рд╕) рдФрд░ рдЙрд╕рдХреЗ (рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕) рдореВрд▓ рд╡рд░реНрдЧ (рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕) рдкрд░ рдХреЙрд▓ рд╣реЛрддреА рд╣реИред
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг:
>>> class Ameta ( type ):
... def foo (cls):
... print 'Ameta.foo'
...
>>> class A ( object ):
... __metaclass__ = Ameta
...
>>> A . foo()
Ameta.foo
рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ - рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБрдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЧреБрдг рдХреЗрд╡рд▓ __dict__ рд╡рд░реНрдЧ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд╕реНрддреБ рдореЗрдВ рдЦреЛрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред
>>> a = A()
>>> a . foo
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
AttributeError : 'A' object has no attribute 'foo'
A .__ рдбрд┐рдХреНрдЯреНрд░реА рдореЗрдВ 'рдлреВ' рдирд╣реАрдВ рд╣реИ:
>>> A . __dict__[ 'foo' ]
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
KeyError : 'foo'
рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрдЯрд╛рдХреНрд▓рд╕ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП:
>>> A . foo()
Ameta.foo
>>> class B (A):
... @classmethod
... def foo (cls):
... print 'B.foo'
...
>>> B . foo # .. foo B.__dict__ B.__dict__['foo']
<bound method Ameta.foo of <class '__main__.B'>>
>>> B . foo()
B.foo
>>> class C (B):
... pass
...
>>> C . foo() # B.
B.foo
C foo B.
>>> c = C()
>>> c . foo()
B.foo
>>> class D (A):
... pass
...
>>> D . foo()
Ameta.foo
рдФрд░ рдЙрджрд╛рд╣рд░рдг D рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛:
>>> d = D()
>>> d . foo()
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
AttributeError : 'D' object has no attribute 'foo'
metaclasses
рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рд╡рд░реНрдЧ (рдпрд╛ рдкреНрд░рдХрд╛рд░) рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рднреА 2 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИ - рдкреНрд░рдХрд╛рд░ (рдХреНрд▓рд╛рд╕) рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ред рдпрд╣ рджреЛ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреА __new__ рдкрджреНрдзрддрд┐ рдХреЛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдирд╛рдо, рдЖрдзрд╛рд░, рдЕрдЯрд░рд╕, рдФрд░ рдлрд┐рд░ __in__ рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
>>> class Meta ( type ):
... pass
...
>>> Meta( 'A' , ( object ,), {})
<class '__main__.A'>
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореЗрдЯрд╛ рдХреНрд▓рд╛рд╕ рдореЗрдЯрд╛ рдЕрдкрдиреЗ __dict__ рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ __new__ рдореЗрдердб рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддреА рд╣реИ, рдЙрд╕реЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдвреВрдВрдврддреА рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдкреЗрд░реЗрдВрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ (рдпрд╛рдиреА рдореЗрдЯрд╛рдХрд╛рд▓рд╛рд╕реЗрд╕ рдЗрд╕ рдХреЗрд╕ рдЯрд╛рдЗрдк рдореЗрдВ) рдХреЗ рд▓рд┐рдП __dict__ рдореЗрдВ рдЦреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ, рдпрд╛рдиреАред рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдЦреЛрдЬ рд╣реЛрддреА рд╣реИред рдЙрдкрдпреБрдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде __new__ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЗ __in____ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд░реВрдк рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ:
cls = type .__ dict __ ['__ new __'] (рдореЗрдЯрд╛, 'рдП', (рдСрдмреНрдЬреЗрдХреНрдЯ), {})
рдкреНрд░рдХрд╛рд░ .__ рддрд╛рдирд╛рд╢рд╛рд╣ __ ['__ init __'] (cls, 'A', (рдСрдмреНрдЬреЗрдХреНрдЯ), {})
рдпрд╛ рд╕реБрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
cls = super (рдореЗрдЯрд╛, рдореЗрдЯрд╛) .__ рдирдпрд╛ __ (рдореЗрдЯрд╛, 'рдП', (рдСрдмреНрдЬреЗрдХреНрдЯ), {})
рд╕реБрдкрд░ (рдореЗрдЯрд╛, рдореЗрдЯрд╛) .__ init __ (рд╕реАрдПрд▓, 'рдП', (рдСрдмреНрдЬреЗрдХреНрдЯ), {})
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡рд╕реНрддреБ рдирд╣реАрдВ ред__ рдирдИ__ рдФрд░ рд╡рд╕реНрддреБ ред__ init__ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдХрд░реЗрдВред _ new__ рдФрд░ type .__ init__ред Object .__ new__ рдФрд░ type .__ new__ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ .__ new__ рдПрдХ рдирд┐рдпрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ ред__ new__ рдкреНрд░рдХрд╛рд░ (рдЯрд╛рдЗрдкреЛрдмреЙрдЬреЗрдХреНрдЯ) рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЕрд░реНрдерд╛рддред рд╡рд░реНрдЧред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
>>> class Meta ( type ):
... def __new__ (mcls, name, bases, attrs):
... print 'creating new class' , name
... return super (Meta, mcls) . __new__(mcls, name, bases, attrs)
... def __init__ (cls, name, bases, attrs):
... print 'initing new class' , name
...
...
>>> class A ( object ):
... __metaclass__ = Meta
...
creating new class A
initing new class A
рд╕рд┐рд░реНрдл рдПрдХ рд╡рд╕реНрддреБ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рджреМрд░рд╛рди, рдХреЛрдИ рд▓реЗрдмрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
>>> a = A()
>>>
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд░рдорд╢рдГ, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЗ __new__ рдФрд░ __init__ рддрд░реАрдХреЛрдВ рдореЗрдВ, рдЖрдк рд╕рдм рдХреБрдЫ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ: рдирд╛рдо, рд╕реБрдкрд░рдХреНрд▓рд╛рд╕ рдХреА рд╕реВрдЪреА, рд╡рд┐рд╢реЗрд╖рддрд╛ред
рд▓рд┐рдВрдХ
рдиреЛрдЯ
[рез] рд╕реБрдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ
рдпрд╣рд╛рдБ ред
рдФрд░ рдкрдврд╝реЗрдВ
рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд╛рд░реНрдЯ 3 рдкрд░ рдиреЛрдЯреНрд╕