рдкрд╛рдпрдерди рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕

рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ StackOverflow рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХрд╣рд╛, "SO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп рд╣реИрд╢рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рд▓реБрдХрдЕрдк рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред" рд╣рдо рдлрд┐рд░ рд╕реЗ рдЗрд╕ рдЕрджреНрднреБрдд рд╕рдВрд╕рд╛рдзрди рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЕрддреНрдпрдВрдд рд╡рд┐рд╕реНрддреГрдд рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреНрдпрд╛ рд╣реИрдВ, рдХреИрд╕реЗ, рдХрд╣рд╛рдБ, рдФрд░ рдХреНрдпреЛрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдХреНрдпреЛрдВ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬ рд╣реИрдВ (рд╕реНрдореЙрд▓рдЯреЙрдХ рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд)ред

рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдПрдХ рд╡рд░реНрдЧ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рднреА рд╕рдЪ рд╣реИ:
>>> class ObjectCreator(object): ... pass ... >>> my_object = ObjectCreator() >>> print my_object <__main__.ObjectCreator object at 0x8974f2c> 

рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдореЗрдВ, рдПрдХ рд╡рд░реНрдЧ рдХреБрдЫ рдФрд░ рд╣реИ - рдХрдХреНрд╖рд╛рдПрдВ рднреА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред

рдПрдХ рдмрд╛рд░ class рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╛рдпрдерди рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдореИрдиреБрдЕрд▓
  >>> class ObjectCreator(object): ... pass ... 

рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ ObjectCreator рдЬрд┐рд╕реЗ ObjectCreator рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ (рдХреНрд▓рд╛рд╕) рдЦреБрдж рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдЗрдВрд╕реНрдЯреЗрдВрд╕) рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдХреНрд▓рд╛рд╕ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП:


рдЧрддрд┐рд╢реАрд▓ рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рдг


рдЪреВрдВрдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рддрд░рд╣, рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк class рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
  >>> def choose_class(name): ... if name == 'foo': ... class Foo(object): ... pass ... return Foo #  ,    ... else: ... class Bar(object): ... pass ... return Bar ... >>> MyClass = choose_class('foo') >>> print MyClass #   ,    <class '__main__.Foo'> >>> print MyClass() #      <__main__.Foo object at 0x89c6d4c> 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдмрд╣реБрдд рдЧрддрд┐рд╢реАрд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрднреА рднреА рдкреВрд░реА рдХрдХреНрд╖рд╛ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрдм class рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╛рдпрдерди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

type рдлрд╝рдВрдХреНрд╢рди рдпрд╛рдж рд░рдЦреЗрдВ? рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
 >>> print type(1) <type 'int'> >>> print type("1") <type 'str'> >>> print type(ObjectCreator) <type 'type'> >>> print type(ObjectCreator()) <class '__main__.ObjectCreator'> 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, type рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ: рдпрд╣ рднреА рдЬрд╛рдиреЗ рдкрд░ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред type рдПрдХ рдХрдХреНрд╖рд╛ рдШреЛрд╖рдгрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдХрдХреНрд╖рд╛ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИред

(рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣ рдореВрд░реНрдЦрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

type рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
  type(< >, <  >, #  ,    <,     >) 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
 >>> class MyShinyClass(object): ... pass 

рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  >>> MyShinyClass = type('MyShinyClass', (), {}) #  - >>> print MyShinyClass <class '__main__.MyShinyClass'> >>> print MyShinyClass() #    <__main__.MyShinyClass object at 0x8997cec> 

рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо "MyShinyClass" рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИред рд╡реЗ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ?

type рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдмрддрд╛рддрд╛ рд╣реИ:
 >>> class Foo(object): ... bar = True 

рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  >>> Foo = type('Foo', (), {'bar':True}) 

рдФрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  >>> print Foo <class '__main__.Foo'> >>> print Foo.bar True >>> f = Foo() >>> print f <__main__.Foo object at 0x8a9b84c> >>> print f.bar True 

рдмреЗрд╢рдХ, рдЖрдк рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:
  >>> class FooChild(Foo): ... pass 

рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛
  >>> FooChild = type('FooChild', (Foo,), {}) >>> print FooChild <class '__main__.FooChild'> >>> print FooChild.bar # bar is inherited from Foo True 

рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:
 >>> def echo_bar(self): ... print self.bar ... >>> FooChild = type('FooChild', (Foo,), {'echo_bar': echo_bar}) >>> hasattr(Foo, 'echo_bar') >>> hasattr(FooChild, 'echo_bar') True >>> my_foo = FooChild() >>> my_foo.echo_bar() True 

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ: рдХрдХреНрд╖рд╛рдПрдВ рдкрд╛рдпрдерди рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдФрд░ рдЖрдк рдЬрд╛рдиреЗ рдкрд░ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

class рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдпрд╣ рдареАрдХ рдпрд╣реА рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреНрдпрд╛ рд╣реИ (рдЕрдВрдд рдореЗрдВ)


рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдПрдХ "рдЪреАрдЬрд╝" рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рддрд╛ рд╣реИред

рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рдПрдХ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╡рд╣ рд╣реИ рдЬреЛ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред рд╡реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╡рд░реНрдЧ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХреА рдХрд▓реНрдкрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
  MyClass = MetaClass() MyObject = MyClass() 

рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ type рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
  MyClass = type('MyClass', (), {}) 

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ type рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдореЗрдЯрд╛рдХреНрд▓рд╕ рд╣реИред type рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдпрдерди рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдХрд┐ рдЙрд╕рдХрд╛ рдирд╛рдо рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, Type рдирд╣реАрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдкрдВрдХреНрддрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ, рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧред type рдХреЗрд╡рд▓ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд╣реИред

рдпрд╣ __class__ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдЕрдЬрдЧрд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ (рд╕рдм рдХреБрдЫ!) рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред рд╕рдВрдЦреНрдпрд╛, рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рд╡реЗ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдереЗ:
  >>> age = 35 >>> age.__class__ <type 'int'> >>> name = 'bob' >>> name.__class__ <type 'str'> >>> def foo(): pass >>> foo.__class__ <type 'function'> >>> class Bar(object): pass >>> b = Bar() >>> b.__class__ <class '__main__.Bar'> 

рдФрд░ рдкреНрд░рддреНрдпреЗрдХ __class__ рд▓рд┐рдП __class__ рдХреНрдпрд╛ рд╣реИ?
  >>> a.__class__.__class__ <type 'type'> >>> age.__class__.__class__ <type 'type'> >>> foo.__class__.__class__ <type 'type'> >>> b.__class__.__class__ <type 'type'> 

рддреЛ, рдПрдХ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╕рд┐рд░реНрдл рдПрдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред

рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ "рдХреНрд▓рд╛рд╕ рдлреИрдХреНрдЯреНрд░реА" рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ

type рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдпрдерди рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

__metaclass__ рд╡рд┐рд╢реЗрд╖рддрд╛


рдХрдХреНрд╖рд╛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдк __metaclass__ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
 class Foo(object): __metaclass__ = something... [...] 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Foo рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╕рдордп рдкрд╛рдпрдерди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рд╕рд╛рд╡рдзрд╛рдиреА, рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ!

рдпрджреНрдпрдкрд┐ рдЖрдк class Foo(object) рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдПрдХ рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рдЕрднреА рддрдХ рд╕реНрдореГрддрд┐ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИред

рдХрдХреНрд╖рд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╛рдпрдерди __metaclass__ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╡рд╣ рдЗрд╕реЗ рдкрд╛ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдХрдХреНрд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Foo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ type рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдпрд╛рдиреА рдЬрдм рдЖрдк рд▓рд┐рдЦреЗрдВрдЧреЗ
 class Foo(Bar): pass 

рдкрд╛рдпрдерди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдХреНрдпрд╛ Foo рд╡рд░реНрдЧ рдореЗрдВ __metaclass__ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ?

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ __metaclass__ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧ рд╕реЗ Foo рдирд╛рдо рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдкрд╛рдпрдерди рдХреЛ __metaclass__ рдирд╣реАрдВ __metaclass__ , рддреЛ рдпрд╣ рдореВрд▓ рд╡рд░реНрдЧ Bar рдореЗрдВ __metaclass__ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ __metaclass__ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рд╕реНрддрд░ рдкрд░ __metaclass__ рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред

рдФрд░ рдЕрдЧрд░ рд╡рд╣ рдХрд┐рд╕реА рднреА __metaclass__ рдХреЛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ: рдореИрдВ __metaclass__ рдореЗрдВ рдХреНрдпрд╛ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ?

рдЙрддреНрддрд░: рдХреБрдЫ рднреА рдЬреЛ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ? type рдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЙрдкрд╡рд░реНрдЧ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рднреА рдЬреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдХрд╕реНрдЯрдо рдореЗрдЯрд╛рдХреНрд▓рд╕


рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╕реГрдЬрди рдХреЗ рд╕рдордп рдХрдХреНрд╖рд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИред

рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдПрдХ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: рдЖрдкрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдЖрдкрдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реНрддрд░ рдкрд░ __metaclass__ рд╕реЗрдЯ __metaclass__ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореЗрдХрд▓реИрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдКрдкрд░реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХреЛ рдмрд╛рдзреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, __metaclass__ рдХреЛ рдХреЛрдИ рднреА рд╡рд╕реНрддреБ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд░реНрдЧ рд╣реЛ (рдореБрдЭреЗ рдирд╛рдо рдореЗрдВ "рд╡рд░реНрдЧ" рд╢рдмреНрдж рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛ рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдмрдХрд╡рд╛рд╕ рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ)ред

рддреЛ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
 #        , #     `type` def upper_attr(future_class_name, future_class_parents, future_class_attr): """  -,        """ #   ,    '__' attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__')) #      uppercase_attr = dict((name.upper(), value) for name, value in attrs) #     `type` return type(future_class_name, future_class_parents, uppercase_attr) __metaclass__ = upper_attr #        class Foo(object): #    __metaclass__ ,       bar = 'bip' print hasattr(Foo, 'bar') # Out: False print hasattr(Foo, 'BAR') # Out: True f = Foo() print f.BAR # Out: 'bip' 

рдФрд░ рдЕрдм рд╡рд╣реА рдмрд╛рдд, рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
 # ,  `type`     ,  `str`  `int`, #       class UpperAttrMetaclass(type): #  __new__   __init__ #       , #     __init__   ,    . #     __new__,     , #    #       ,     , #    __new__. #    -  __init__,  . #        __call__, #      . def __new__(upperattr_metaclass, future_class_name, future_class_parents, future_class_attr): attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__')) uppercase_attr = dict((name.upper(), value) for name, value in attrs) return type(future_class_name, future_class_parents, uppercase_attr) 

рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ OOP рдирд╣реАрдВ рд╣реИред рд╣рдо рд╕реАрдзреЗ рдХреЙрд▓ type рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреИрд░реЗрдВрдЯ __new__ рдХреЙрд▓ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ:
 class UpperAttrMetaclass(type): def __new__(upperattr_metaclass, future_class_name, future_class_parents, future_class_attr): attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__')) uppercase_attr = dict((name.upper(), value) for name, value in attrs) #   type.__new__ #  ,   return type.__new__(upperattr_metaclass, future_class_name, future_class_parents, uppercase_attr) 

рдЖрдкрдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ upperattr_metaclass рддрд░реНрдХ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИ: рдПрдХ рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрджрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред рдЬреИрд╕реЗ рдЖрдк рдирд┐рдпрдорд┐рдд рддрд░реАрдХреЛрдВ рдореЗрдВ self рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред

рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдЬреЛ рдирд╛рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рд╣реИрдВ, рд╡реЗ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди self рддрд░рд╣, рдЗрди рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореНрдореЗрд▓рди рд╣реИред рддреЛ рдЕрд╕рд▓реА рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 class UpperAttrMetaclass(type): def __new__(cls, name, bases, dct): attrs = ((name, value) for name, value in dct.items() if not name.startswith('__')) uppercase_attr = dict((name.upper(), value) for name, value in attrs) return type.__new__(cls, name, bases, uppercase_attr) 

рдЖрдк super рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ (рдЪреВрдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк type рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдореЗрдЯрд╛рд╕реЗрд▓реНрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдореЗрдЯрд╛рдЪреИрд▓реНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ):
 class UpperAttrMetaclass(type): def __new__(cls, name, bases, dct): attrs = ((name, value) for name, value in dct.items() if not name.startswith('__')) uppercase_attr = dict((name.upper(), value) for name, value in attrs) return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, uppercase_attr) 

рд╡рд╣ рд╕рдм рд╣реИред рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рд╕реНрд╡рдпрдВ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╣реИ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг, рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд╣реЗрд░рдлреЗрд░, __dict__ рдЬреИрд╕реЗ рдЪрд░ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рд╖реНрдХреГрдд рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП __dict__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рднреА "рдХрд╛рд▓реЗ рдЬрд╛рджреВ" рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЬрдЯрд┐рд▓ рдЯреБрдХрдбрд╝реЗред рд▓реЗрдХрд┐рди рд╡реЗ рд╕реНрд╡рдпрдВ рд╕рд░рд▓ рд╣реИрдВ:


рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?


рдЪреВрдВрдХрд┐ __metaclass__ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдЪрд╛рдирдХ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗ?

рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ:


рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?


рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп рд╕рд╡рд╛рд▓ред рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ (рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдпреЛрдЧрджрд╛рди) рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдЧрд╛?

рдареАрдХ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
Metaclasses рдЧрд╣рд░рд╛ рдЬрд╛рджреВ рд╣реИ рдХрд┐ 99% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реЛрдЪрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдРрд╕реЗ рд▓реЛрдЧ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ)ред
~ рдкрд╛рдпрдерди рдЧреБрд░реБ рдЯрд┐рдо рдкреАрдЯрд░реНрд╕

рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг Django ORM рд╣реИред

рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
  class Person(models.Model): name = models.CharField(max_length=30) age = models.IntegerField() 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
  guy = Person(name='bob', age='35') print guy.age 

рдЖрдкрдХреЛ IntegerField рдирд╣реАрдВ, рд▓реЗрдХрд┐рди int , рдФрд░ рдореВрд▓реНрдп рд╕реАрдзреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ __metaclass__ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рдЬрд╛рджреВ рдХрд░реЗрдЧрд╛ рдФрд░ Person рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдХ рд╕рд░рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

Django рдПрдХ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ рдФрд░ рдПрдкреАрдЖрдИ рд╕реЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЪреБрдкрдЪрд╛рдк рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдиреЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рддреНрд╡рд░рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдХреНрд╖рд╛рдПрдВ рднреА рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдгред
  >>> class Foo(object): pass >>> id(Foo) 142630324 

рдкрд╛рдЗрдерди рдореЗрдВ рдХреЛрдИ рднреА рд╡рд╕реНрддреБ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ: рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╛ рдПрдХ рдореЗрдЯрд╛рдХрд╛реЕрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдгред

рд╕рд┐рд╡рд╛рдп type ред

type рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдореЗрдЯрд╛рдХреНрд▓рд╕ рд╣реИред рдЗрд╕реЗ рд╢реБрджреНрдз рдкрд╛рдпрдерди рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕реНрддрд░ рдкрд░ рдереЛрдбрд╝рд╛ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░реЗ, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдЬрдЯрд┐рд▓ рд╣реИрдВред рдЖрдкрдХреЛ рдмрд╕ рдХрдХреНрд╖рд╛рдПрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрди рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди 99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ :-)

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


All Articles