рдЕрдЬрдЧрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо (
рдкрд╣рд▓реЗ рдФрд░
рджреВрд╕рд░реЗ рднрд╛рдЧ) рдкрд░ рдиреЛрдЯреЛрдВ рдХрд╛ рддреАрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ред рд▓реЗрдЦ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рд╕реА .__ рдХреЙрд▓ __ () рд╕реА () рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдореИрдирд▓рд┐рдВрдЧ рдХреНрдпрд╛ рдирд╛рдо рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
c .__ call__ vs c (), c .__ setattr__ vs setattr
рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдирдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП x (arg1, arg2) x .__ рдХреЙрд▓ __ (arg1, arg2) рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреБрд░рд╛рдиреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред
>>> class C ( object ):
... pass
...
>>> c = C()
>>> c . __call__ = lambda : 42
>>> c()
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
TypeError : 'C' object is not callable
>>> C . __call__ = lambda self : 42
>>> c()
42
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА:
c ()
<=> рдкреНрд░рдХрд╛рд░ ┬й
ред __call __ (s)
рд╕реНрдерд┐рддрд┐ рдмрд┐рд▓реНрдХреБрд▓ __setattr __ / setattr рдФрд░ рдХрдИ рдЕрдиреНрдп рдЬрд╛рджреВ (рдФрд░ рд╡рд┐рд╢реЗрд╖) рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИ рдЬреЛ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ - рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдПрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕реЗ рд╕реЗрдЯрдЯреНрд░рд╛ [1] рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ , рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐
setattr (a,
'x' ,
1 )
<==> рдкреНрд░рдХрд╛рд░ (a)
ред __setattr __ (a,
'x' ,
1 )ред
a
ред x
= 1 <=> setattr (рдП,
'x' ,
1 )
>>> class A ( object ): pass
...
>>> a = A()
>>> a . x = 1
>>> a
<__main__.A object at 0x7fafa9b26f90>
>>> setattr (a, 'y' , 2 )
>>> a . __dict__
{'y': 2, 'x': 1}
__Setattr__ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ __dict__ рдкрд░ рдЬрд╛рдПрдЧреА
>>> a . __setattr__( 'z' , 3 )
рд╕рдм рдХреБрдЫ рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ:
>>> a . __dict__
{'y': 2, 'x': 1, 'z': 3}
рд╣рд╛рд▓рд╛рдВрдХрд┐:
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВред рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ .__ setattr__:
>>> a . __setattr__ = lambda self : 42
рдПрдХ рдХреЙрд▓ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:
>>> a . __setattr__( 'z' , 4 )
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
TypeError : <lambda>() takes exactly 1 argument (2 given)
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕реЗрдЯрдЯреНрд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
>>> setattr (a, 'foo' , 'bar' )
>>> a . __dict__
{'y': 2, 'x': 1, '__setattr__': <function <lambda> at 0x7fafa9b3a140>, 'z': 3, 'foo': 'bar'}
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ:
>>> A . __setattr__ = lambda self : 42
рддрдм рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдЯреНрд░реЗрдб рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛:
>>> setattr (a, 'baz' , 'quux' )
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
TypeError : <lambda>() takes exactly 1 argument (3 given)
рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛?
рд╕реЗрдЯрдЯреНрд░ (a, 'x', 1) рдХреЛ .__ рд╕реЗрдЯрдЯреНрд░рд╛ __ ('x', 1, рдлрд┐рд░) рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
>>> class A ( object ):
... def __setattr__ ( self , attr, value):
... print 'for instances' , attr, value
... object . __setattr__( self , attr, value)
...
>>> a = A()
Aax рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░реЗрдВ = 1 <==> .__ setattr __ ('x', 1)
рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ:
>>> a . __setattr__( 'x' , 1 )
for instances x 1
>>> a . __dict__
{'x': 1}
рдЕрдм рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╡рд╕реНрддреБ рднреА рд╣реИ: A.foo = 'bar' <<==> A .__ setattr __ ('foo', 'bar')
>>> A . __setattr__( 'foo' , 'bar' )
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
TypeError : unbound method __setattr__() must be called with A instance as first argument (got str instance instead)
рд╡рд░реНрдЧреЛрдВ (рдкреНрд░рдХрд╛рд░) рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдм рдХреБрдЫ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдкрд╣рд▓рд╛ рдЧреБрдг рд╡рд░реНрдЧ (рдкреНрд░рдХрд╛рд░) рдХреЗ __dict__ рдореЗрдВ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рд╣реИ:
>>> A . __dict__[ '__setattr__' ]
<function __setattr__ at 0x7f699d22fa28>
рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рди рдХрд┐ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдП .__ рд╕реЗрдЯрдЯреНрд░рд╛ __ ('рдлреВ', 'рдмрд╛рд░') рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ setattr () рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд░реНрдЧ (рдкреНрд░рдХрд╛рд░) рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЦреЛрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рджрд░рдЕрд╕рд▓, рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдпрд╣ рдЕрдиреНрдп рдЬрд╛рджреВ рд╡рд┐рдзрд┐рдпреЛрдВ __add__, __len__, __getatti__ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдХреНрд╖рд╛
рдПрдХ рд╡рд░реНрдЧ (рдкреНрд░рдХрд╛рд░) рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдХреЙрд▓ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред
>>> class C ( object ):
... pass
...
>>> ()
<__main__.C object at 0x1121e10>
рдХреЗ рдмрд░рд╛рдмрд░:
>>> type (C) . __call__(C)
<__main__.C object at 0x1121ed0>
рдХреНрдпреЛрдВрдХрд┐ C рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд╣реИ, рдлрд┐рд░ рдЗрд╕рдХрд╛ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдЯрд╛рдЗрдк рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдк рдЯреВ рдХреЙрд▓ (C) .__ рдХреЙрд▓ __ (C) <==> рдЯрд╛рдЗрдк .__ рдХреЙрд▓ __ (C) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрдирд╕рд╛рдЗрдб рдЯрд╛рдЗрдк .__ рдХреЙрд▓ __ (C), C .__ рдиреНрдпреВ __ (cls, ...) рдФрд░ C .__ рдЗрдирд┐рдЯ __ (рд╕реЗрд▓реНрдл, ...) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╣реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ __new__ рдФрд░ __init__ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЧреБрдг рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ C .__ рд╢реНрд░реБрддрд┐рдХрд╛ рдореЗрдВ рдЙрдирдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореВрд▓ рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рд╕реЗ рд╡рд┐рдзрд┐рдпрд╛рдБ: рдСрдмреНрдЬреЗрдХреНрдЯ .__ new__ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ .__ init____ рдХрд╣рд▓рд╛рдПрдВрдЧреЗ, рдЬрдмрдХрд┐ __call__ рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреНрд▓рд╛рд╕ (рдкреНрд░рдХрд╛рд░) рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ: рдкреНрд░рдХрд╛рд░ ред__ рдХреЙрд▓ __ (C)ред
рд╕рд┐рдВрдЧрд▓рдЯрди рд╡реАред реи
рдпрд╣ рдЬрд╛рдирдХрд░, рд╣рдо рдПрдХ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВрдЧреЗред
рд╣рдореЗрдВ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рдЙрд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП A () рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред
рдП () <=> рдкреНрд░рдХрд╛рд░ (рдП) .__ рдХреЙрд▓ __ (рдП)
рддреЛ, рд╣рдореЗрдВ __call__ рдкрджреНрдзрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореЗрдЯрд╛рдХреНрд▓рд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдпрд╣ рднреВрд▓рдХрд░ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ __call__ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
>>> class SingletonMeta ( type ):
... def __call__ (cls, * args, ** kw):
... return super (SingletonMeta, cls) . __call__( * args, ** kw)
...
>>>
рдареВрдВрда рддреИрдпрд╛рд░ рд╣реИред
рдХрд┐рд╕реА рдПрдХрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрд╡реГрддреНрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, __init__ рдореЗрдВ cls.instance рдкрд░ рдЖрд░рдВрдн рдХрд░реЗрдВред
>>> class SingletonMeta ( type ):
... def __init__ (cls, * args, ** kw):
... cls . instance = None
... def __call__ (cls, * args, ** kw):
... return super (SingletonMeta, cls) . __call__( * args, ** kw)
...
>>>
__call__:
>>> class SingletonMeta ( type ):
... def __init__ (cls, * args, ** kw):
... cls . instance = None
... def __call__ (cls, * args, ** kw):
... if cls . instance is None :
... cls . instance = super (SingletonMeta, cls) . __call__( * args, ** kw)
... return cls . instance
...
>>> class C ( object ):
... __metaclass__ = SingletonMeta
...
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдЙрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
>>> C() is C()
True
>>> a = C()
>>> b = C()
>>> a . x = 42
>>> b . x
42
>>>
рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░
рдПрдХ рдореЗрдЯрд╛рдХрд╛рд▓рд╛рд╕ рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡рд╕реНрддреБ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдмрд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
>>> def mymeta (name, bases, attrs):
... attrs[ 'foo' ] = 'bar'
... return type (name, bases, attrs)
...
>>> class D ( object ):
... __metaclass__ = mymeta
...
>>> D()
<__main__.D object at 0x7fafa9abc090>
>>> d = D()
>>> d . foo
'bar'
>>> d . __dict__
{}
>>> D . __dict__
<dictproxy object at 0x7fafa9b297f8>
>>> dict (D . __dict__)
{'__module__': '__main__', '__metaclass__': <function mymeta at 0x7fafa9b3a9b0>, '__dict__': <attribute '__dict__' of 'D' objects>, 'foo': 'bar', '__weakref__': <attribute '__weakref__' of 'D' objects>, '__doc__': None}
рдХрдХреНрд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ
рдПрдХ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдмрдпрд╛рди рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рд░реНрдорд╛рдг рд╣реИред рдХрд┐рд╕реА рднреА рдмрдпрд╛рди рдХреА рддрд░рд╣, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред
>>> if True :
... class A ( object ):
... def foo ( self ):
... print 42
...
>>> A
<class '__main__.A'>
>>> A() . foo()
42
>>>
'рд╡рд░реНрдЧ' рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ, рдХреЛрдИ рднреА рдЪрд░, рдХрд╛рд░реНрдп, рд╡рд░реНрдЧ, рдЬрд┐рдиреНрд╣реЗрдВ __dict__ рдореЗрдВ рд╕рдВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЖрдк рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реВрдкреНрд╕, рдЕрдЧрд░:ред
рдЗрд╕рд▓рд┐рдП, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
>>> class A ( object ):
... if 1 > 2 :
... def foo ( self ):
... print '1>2'
... else :
... def bar ( self ):
... print 'else'
...
>>>
>>> A()
<__main__.A object at 0x7fafa9abc150>
>>> A() . foo()
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
AttributeError : 'A' object has no attribute 'foo'
>>> A() . bar()
else
рдпрд╛ рддреЛ
>>> class A ( object ):
... if 1 > 2 :
... x = 1
... def foo ( self ):
... print 'if'
... else :
... y = 1
... def bar ( self ):
... print 'else'
...
>>> A . x
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
AttributeError : type object 'A' has no attribute 'x'
>>> A . y
1
>>> A . foo
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
AttributeError : type object 'A' has no attribute 'foo'
>>> A . bar
<unbound method A.bar>
>>> A . bar()
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
TypeError : unbound method bar() must be called with A instance as first argument (got nothing instead)
>>> A() . bar()
else
>>>
рдЖрдк рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
>>> class A ( object ):
... class B ( object ):
... pass
...
...
>>> A()
<__main__.A object at 0x7fafa9abc2d0>
>>> A . __dict__
<dictproxy object at 0x7fafa9b340f8>
>>> dict (A . __dict__)
{'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__main__', 'B': <class '__main__.B'>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
>>> A . B()
<__main__.B object at 0x7fafa9abc310>
рдпрд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдмрдирд╛рдПрдБ:
>>> FIELDS = [ 'a' , 'b' , 'c' ]
>>> class A ( object ):
... for f in FIELDS:
... locals ()[f] = lambda self : 42
...
>>> a = A()
>>> a . a()
42
>>> a . b()
42
>>> a . c()
42
>>> a . d()
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
AttributeError : 'A' object has no attribute 'd'
>>>
рдпрджреНрдпрдкрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдирд╛рдордХрд░рдг
рдФрд░ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдирд╛рдордХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдлреЙрд░реНрдо рдХреА рдХрдХреНрд╖рд╛ рдХреЗ рд╡рд░реНрдЧрдирд╛рдо рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рднреАрддрд░ рдХреЛрдИ рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ ".__ {attr}" (рдЙрд╕реА рд╕рдордп, attr рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдПрдХ _ рдЕрдВрдд рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ) "_ {classname} __ {attr}" рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдВрджрд░, рдЖрдкрдХреЗ рдкрд╛рд╕ "рдЫрд┐рдкреА рд╣реБрдИ" рдирд┐рдЬреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рд╡рд░реНрдЧ рдХреЗ рд╡рд╛рд░рд┐рд╕реЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП "рджреГрд╢реНрдпрдорд╛рди" рдирд╣реАрдВ рд╣реИрдВред
>>> class A ( object ):
... __private_foo =1
...
>>> A . __private_foo
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
AttributeError : type object 'A' has no attribute '__private_foo'
рдЖрдк рдЪрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
>>> A . _A__private_foo
1
рдЦреИрд░, рдпрд╣ __dict__ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:
>>> dict (A . __dict__)
{'__dict__': <attribute '__dict__' of 'A' objects>, '_A__private_foo': 1, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
>>>
рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ:
>>> class B (A):
... def foo ( self ):
... print self . __private_foo
...
>>> B() . foo()
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
File "<stdin>" , line 3 , in foo
AttributeError : 'B' object has no attribute '_B__private_foo'
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрджрд░ __ {Attr} рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддред рдЖрдк __dict__ рдХреЗ рд╕рд╛рде name_mangling рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
>>> class C ( object ):
... def __init__ ( self ):
... self . __dict__[ '__value' ] = 1
...
>>> C() . __value
1
>>>
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рджреГрдврд╝рддрд╛ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ ".__ {Attr}" рдХреЗ рд╕рд╛рде ._ {classname} __ {attr} рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдХрд╛рд░рдг рдХрд┐рд╕реА
рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧреАред рд╡реЗ рдХрд┐рд╕ рд╡рд╕реНрддреБ рдпрд╛ рд╡рд░реНрдЧ рд╕реЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН
>>> class D ( object ):
... def __init__ ( self ):
... self . c = C() . __value
...
>>> D()
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
File "<stdin>" , line 3 , in __init__
AttributeError : 'C' object has no attribute '_D__value'
>>> C() . __value
1
>>>
рдпрджреНрдпрдкрд┐ C () .__ рдорд╛рди рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ __dict __ ['__ value'] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд▓рд┐рдВрдХ
рдиреЛрдЯ
[рез] рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ __len __ / len рдФрд░ __hash __ / hash рдХреЗ рд╕рд╛рде
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред