рдкрд╛рдпрдерди: рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред рдПрдХ рднрд╛рдЧ

рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрдЯрд┐рд▓ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЛ рдЬрд▓реНрджреА рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рдкрд╛рдпрдерди рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬреИрд╕реЗ рдХрд┐ Django, DRF, рдФрд░ SQLAlchemy рдореЗрдЯрд╛рд╕реЗрдХреНрд▓реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрд╕рд╛рди рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдФрд░ рдЖрд╕рд╛рди рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред



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


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдкрд╛рдпрдерди рдореЗрдВ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдпрд╛рдж рдХрд░реЗрдВред рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЕрддрд┐рд╢реНрдпреЛрдХреНрддрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдЬреЛ рдХреБрдЫ рднреА рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг 3.5 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред


рдкрд╛рдпрдерди рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рддреНрд╡рд░рд┐рдд рджреМрд░рд╛


рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


>>> def f(): pass >>> type(f) <class 'function'> 

рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╡рд░реНрдЧ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ (рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ)ред рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдкрд░ __class__ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд▓рд╛рд╕ function ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрдЯ-рдЗрди рдкреНрд░рдХрд╛рд░ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд▓реЗрдВ:


 >>> from types import FunctionType >>> FunctionType <class 'function'> >>> help(FunctionType) class function(object) | function(code, globals[, name[, argdefs[, closure]]]) | | Create a function object from a code object and a dictionary. | The optional name string overrides the name from the code object. | The optional argdefs tuple specifies the default argument values. | The optional closure tuple supplies the bindings for free variables. 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЖрдЗрдП рдЕрдм рдбрд┐рдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рдШреЛрд╖рдгрд╛ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╕рдВрдХрд▓рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рдПрдВ:


 #   ,    "Hello, world!" >>> code = compile('print("Hello, world!")', '<repl>', 'eval') >>> code <code object <module> at 0xdeadbeef, file "<repl>", line 1> #  ,     , #      >>> func = FunctionType(code, globals(), 'greetings') >>> func <function <module> at 0xcafefeed> >>> func.__name__ 'greetings' >>> func() Hello, world! 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдореЗрдЯрд╛-рдЯреВрд▓реНрд╕ рдХреА рдорджрдж рд╕реЗ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдлреНрд▓рд╛рдИ рдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдЗрдП рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 >>> class User: pass >>> user = User() >>> type(user) <class '__main__.User'> >>> type(User) <class 'type'> 

рдпрд╣ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ User рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ user рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ type рд╡рд░реНрдЧ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ User рд╡рд░реНрдЧ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд type рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреА рдУрд░ рдореБрдбрд╝реЗрдВрдЧреЗ, рдЬреЛ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдкрд╛рдпрдерди рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдЯрд╛рдХрд╛реЕрд▓ рд╣реИред рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЕрдиреНрдп рд╡рд░реНрдЧ рд╣реИред рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡реГрддреНрддрд┐ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рджреВрд╕рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ type(name, bases, attrs) - рдПрдХ рдирдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛, рдпрджрд┐ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ - рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ, рдФрд░ name рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ рд▓реМрдЯреЗ рд╣реБрдП рд╡рд░реНрдЧ рдХреА __name__ рд╡рд┐рд╢реЗрд╖рддрд╛, bases - рдореВрд▓ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕реВрдЪреА __bases__ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред рдЦреИрд░, attrs - рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рддрд░реАрдХреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рддрд╛рдирд╛рд╢рд╛рд╣ рдЬреИрд╕реА рд╡рд╕реНрддреБ, __dict__ рдореЗрдВ __dict__ ред рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдЫрджреНрдо рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 type(name, bases, attrs) ~ class name(bases): attrs 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдХреИрд╕реЗ, рдХреЗрд╡рд▓ type рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдП рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 >>> User = type('User', (), {}) >>> User <class '__main__.User'> 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП class рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, type рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рджреЗрдЦреЗрдВ:


 class User: def __init__(self, name): self.name = name class SuperUser(User): """Encapsulate domain logic to work with super users""" group_name = 'admin' @property def login(self): return f'{self.group_name}/{self.name}'.lower() #     SuperUser "" CustomSuperUser = type( #   'SuperUser', #  ,      (User, ), #         { '__doc__': 'Encapsulate domain logic to work with super users', 'group_name': 'admin', 'login': property(lambda self: f'{self.group_name}/{self.name}'.lower()), } ) assert SuperUser.__doc__ == CustomSuperUser.__doc__ assert SuperUser('Vladimir').login == CustomSuperUser('Vladimir').login 

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


рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдкрддреНрд░ рдФрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ


рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдбреЗрдЯрд╛ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдЕрдиреНрдп рдмрд╛рд╣рд░реА рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдлрд╝реЙрд░реНрдо рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╣рдЯрд╛рдПрдВ рдФрд░ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ, рдЙрдирдХреА рдорд╛рдиреНрдпрддрд╛ рдХреА рд░рдгрдиреАрддрд┐ рдмрджрд▓реЗрдВ, рдЖрджрд┐ред


рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП Django рдлреЙрд░реНрдо рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд json рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:


 { "fist_name": { "type": "str", "max_length": 25 }, "last_name": { "type": "str", "max_length": 30 }, "age": { "type": "int", "min_value": 18, "max_value": 99 } } 

рдЕрдм, рдКрдкрд░ рджрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЦреЗрддреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдФрд░ рдПрдХ рдирдпрд╛ рд░реВрдк type рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ:


 import json from django import forms fields_type_map = { 'str': forms.CharField, 'int': forms.IntegerField, } # form_description тАУ  json    deserialized_form_description: dict = json.loads(form_description) form_attrs = {} #            for field_name, field_description in deserialized_form_description.items(): field_class = fields_type_map[field_description.pop('type')] form_attrs[field_name] = field_class(**field_description) user_form_class = type('DynamicForm', (forms.Form, ), form_attrs) >>> form = user_form_class({'age': 101}) >>> form <DynamicForm bound=True, valid=Unknown, fields=(fist_name;last_name;age)> >>> form.is_valid() False >>> form.errors {'fist_name': ['This field is required.'], 'last_name': ['This field is required.'], 'age': ['Ensure this value is less than or equal to 99.']} 

рд╕реБрдкрд░! рдЕрдм рдЖрдк рдмрдирд╛рдП рдЧрдП рдлреЙрд░реНрдо рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ ( DRF Serializers , marshmallow рдФрд░ рдЕрдиреНрдп) рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдирдП рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


рдКрдкрд░, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╕рдорд╛рдкреНрдд" type рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХреЛ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдХреЛрдб рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЗрдЯрд╛рдХреНрд▓реЗрд╕реЗрд╕ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдирдП рд╡рд░реНрдЧреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХрд╛ "рд░рд┐рдХреНрдд" рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 class MetaClass(type): """   : mcs тАУ  ,  <__main__.MetaClass> name тАУ ,  ,     ,  "User" bases тАУ   -,  (SomeMixin, AbstractUser) attrs тАУ dict-like ,         cls тАУ  ,  <__main__.User> extra_kwargs тАУ  keyword-     args  kwargs тАУ          """ def __new__(mcs, name, bases, attrs, **extra_kwargs): return super().__new__(mcs, name, bases, attrs) def __init__(cls, name, bases, attrs, **extra_kwargs): super().__init__(cls) @classmethod def __prepare__(mcs, cls, bases, **extra_kwargs): return super().__prepare__(mcs, cls, bases, **kwargs) def __call__(cls, *args, **kwargs): return super().__call__(*args, **kwargs) 

User рд╡рд░реНрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 class User(metaclass=MetaClass): def __new__(cls, name): return super().__new__(cls) def __init__(self, name): self.name = name 

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


  1. рджреБрднрд╛рд╖рд┐рдпрд╛ рд╡рд░реНрддрдорд╛рди рдХрдХреНрд╖рд╛ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЗ рд▓рд┐рдП рдореВрд▓ рдХрдХреНрд╖рд╛рдПрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╛рддрд╛ рд╣реИред
  2. рджреБрднрд╛рд╖рд┐рдпрд╛ рдПрдХ MetaClass (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ MetaClass ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  3. MetaClass.__prepare__ рд╡рд┐рдзрд┐ рдХреЛ MetaClass.__prepare__ - рдЗрд╕реЗ рдПрдХ MetaClass.__prepare__ рдЬреИрд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ MetaClass.__new__ рд╕реЗ MetaClass.__new__ рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
  4. рджреБрднрд╛рд╖рд┐рдпрд╛ User рд╡рд░реНрдЧ рдХреЗ рд╢рд░реАрд░ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ MetaClass рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
  5. MetaClass.__new__ рд╡рд┐рдзрд┐ рдХреЛ MetaClass.__new__ - MetaClass.__new__ рд╡рд┐рдзрд┐, рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ type рдлрдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрд░реНрдХреЛрдВ, name рдФрд░ bases рд╕рд╛рде рдорд┐рд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо **extra_kwargs рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ __prepare__ рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ __prepare__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕реЗ super() рд╡рд┐рдзрд┐ рдХреЙрд▓ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдПрдХ __prepare__ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  6. MetaClass.__init__ рд╡рд┐рдзрд┐ рдХреЛ MetaClass.__init__ - рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдзрд┐ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдЕрдиреНрдп рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ __init__ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ __new__ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, __slots__ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ __new__ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ __new__ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рд┐рдЦрдХрд░ред
  7. рдЗрд╕ рдХрджрдо рдкрд░, рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рд╣рдорд╛рд░реЗ User рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рджреЗрдЦреЗрдВ:


 user = User(name='Alyosha') 

  1. User(...) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдордп User(...) рджреБрднрд╛рд╖рд┐рдпрд╛ MetaClass.__call__(name='Alyosha') рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. MetaClass.__call__ рдХреЙрд▓ User.__new__(name='Alyosha') MetaClass.__call__ User.__new__(name='Alyosha') - рдПрдХ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ User рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ
  3. рдЗрд╕рдХреЗ рдмрд╛рдж, MetaClass.__call__ рдХреЙрд▓ User.__init__(name='Alyosha') MetaClass.__call__ User.__init__(name='Alyosha') - рдПрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рд╡рд┐рдзрд┐ рдЬреЛ рдмрдирд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЬреЛрдбрд╝рддреА рд╣реИред
  4. MetaClass.__call__ User рд╡рд░реНрдЧ рдХрд╛ рдмрдирд╛рдпрд╛ рдФрд░ рдЖрд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред
  5. рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╡рд┐рд╡рд░рдг, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ!


рд╕рд╛рд░ рд╡рд░реНрдЧ


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


 from abc import ABCMeta, abstractmethod class BasePlugin(metaclass=ABCMeta): """   supported_formats   run        """ @property @abstractmethod def supported_formats(self) -> list: pass @abstractmethod def run(self, input_data: dict): pass 

рдпрджрд┐ рд╡рд╛рд░рд┐рд╕ рдореЗрдВ рд╕рднреА рдЕрдореВрд░реНрдд рд╡рд┐рдзрд┐рдпрд╛рдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдЬрдм рд╣рдо рд╡рд╛рд░рд┐рд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ TypeError рдорд┐рд▓рддрд╛ рд╣реИ:


 class VideoPlugin(BasePlugin): def run(self): print('Processing video...') plugin = VideoPlugin() # TypeError: Can't instantiate abstract class VideoPlugin # with abstract methods supported_formats 

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


рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрдВрдЬреАрдХрд░рдг рдкреНрд▓рдЧрдЗрди рдкреНрд░рдгрд╛рд▓реА


рдЕрдХреНрд╕рд░, рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдкреНрд░рд╕рд┐рджреНрдз рдврд╛рдВрдЪрд╛ рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╣реАрдВ рднреА рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рдСрдЯреЛ-рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рдореЗрдЯрд╛рдХреНрд▓реЛрдЬрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


 class RegistryMeta(ABCMeta): """ ,      .     " " -> " " """ _registry_formats = {} def __new__(mcs, name, bases, attrs): cls: 'BasePlugin' = super().__new__(mcs, name, bases, attrs) #     (BasePlugin) if inspect.isabstract(cls): return cls for media_format in cls.supported_formats: if media_format in mcs._registry_formats: raise ValueError(f'Format {media_format} is already registered') #       mcs._registry_formats[media_format] = cls return cls @classmethod def get_plugin(mcs, media_format: str): try: return mcs._registry_formats[media_format] except KeyError: raise RuntimeError(f'Plugin is not defined for {media_format}') @classmethod def show_registry(mcs): from pprint import pprint pprint(mcs._registry_formats) 

рдФрд░ рдпрд╣рд╛рдБ рд╕реНрд╡рдпрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ BasePlugin рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓реЗрдВрдЧреЗ:


 class BasePlugin(metaclass=RegistryMeta): ... class VideoPlugin(BasePlugin): supported_formats = ['mpg', 'mov'] def run(self): ... class AudioPlugin(BasePlugin): supported_formats = ['mp3', 'flac'] def run(self): ... 

рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣рдорд╛рд░реА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ 4 рдкреНрд░рд╛рд░реВрдк рдФрд░ 2 рдкреНрд▓рдЧ рдЗрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


 >>> RegistryMeta.show_registry() {'flac': <class '__main__.AudioPlugin'>, 'mov': <class '__main__.VideoPlugin'>, 'mp3': <class '__main__.AudioPlugin'>, 'mpg': <class '__main__.VideoPlugin'>} >>> plugin_class = RegistryMeta.get_plugin('mov') >>> plugin_class <class '__main__.VideoPlugin'> >>> plugin_class().run() Processing video... 

рдпрд╣ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдзрд┐ рд╕рдВрдХрд▓реНрдк рдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рди рдХреЗрд╡рд▓ RegistyMeta рд╡рд░реНрдЧ рдкрд░ show_registry рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╡рд░реНрдЧ рдкрд░ рдпрд╣ RegistyMeta :


 >>> AudioPlugin.get_plugin('avi') # RuntimeError: Plugin is not found for avi 

рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ? рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдХрдИ рдмрд╛рд░ рджреЗрдЦрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Django рдореЗрдВ рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рдШреЛрд╖рдгрд╛:


 class Book(models.Model): title = models.Charfield(max_length=250) 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, title рдкрд╛рдпрдерди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдирд╛рдо рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ book рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣реАрдВ рднреА рдпрд╣ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред рд╣рд╛рдБ, рдЗрд╕ рддрд░рд╣ рдХреЗ "рдЬрд╛рджреВ" рдХреЛ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдорджрдж рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдкрдардиреАрдп рдХреЛрдб рд╣реЛ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢ рдХреЛ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрджреЗрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ json рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 class Message: def __init__(self, text, code=None): self.text = text self.code = code def to_json(self): return json.dumps({'text': self.text, 'code': self.code}) 

рд╣рдорд╛рд░реЗ рд╕рднреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдПрдХ рдЕрд▓рдЧ "рдиреЗрдорд╕реНрдкреЗрд╕" рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:


 class Messages: not_found = Message('Resource not found') bad_request = Message('Request body is invalid') ... >>> Messages.not_found.to_json() {"text": "Resource not found", "code": null} 

рдЕрдм рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ code null рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ not_found , рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд not_found рд▓рд┐рдЦрддреЗ рд╣реИрдВ:


 class MetaMessage(type): def __new__(mcs, name, bases, attrs): for attr, value in attrs.items(): #          Message #    code    # ( code   ) if isinstance(value, Message) and value.code is None: value.code = attr return super().__new__(mcs, name, bases, attrs) class Messages(metaclass=MetaMessage): ... 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдкреЛрд╕реНрдЯ рдЕрдм рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИрдВ:


 >>> Messages.not_found.to_json() {"text": "Resource not found", "code": "not_found"} >>> Messages.bad_request.to_json() {"text": "Request body is invalid", "code": "bad_request"} 

рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП! рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрд╕ рдХреЛрдб рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред


рдПрдХ рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ рд╡рдВрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢рд┐рдВрдЧ


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


рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реА рдХреЛрдИ рд╡рд╕реНрддреБ рд╣реИ:


 class Row(metaclass=MetaRow): name: str age: int ... def __init__(self, **kwargs): self.counter = None for attr, value in kwargs.items(): setattr(self, attr, value) def __str__(self): out = [self.counter] #  __header__      for name in self.__header__[1:]: out.append(getattr(self, name, 'N/A')) return ' | '.join(map(str, out)) 

рд╣рдо рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдмрдирд╛рддреЗ рд╕рдордп рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдФрд░ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╣реЗрдбрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рд╕реЗрд▓реНрд╕!


 class MetaRow(type): #      row_count = 0 def __new__(mcs, name, bases, attrs): cls = super().__new__(mcs, name, bases, attrs) #          cls.__header__ = ['тДЦ'] + sorted(attrs['__annotations__'].keys()) return cls def __call__(cls, *args, **kwargs): #      row: 'Row' = super().__call__(*args, **kwargs) #    cls.row_count += 1 #     row.counter = cls.row_count return row 

рдпрд╣рд╛рдВ рджреЛ рдмрд╛рддреЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • Row рд╡рд░реНрдЧ рдореЗрдВ name рдФрд░ age рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдЧреБрдг рдирд╣реАрдВ рд╣реИрдВ - рдпреЗ рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рд╡реЗ attrs рд╢рдмреНрджрдХреЛрд╢ рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдлрд╝реАрд▓реНрдб рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо __annotations__ рд╡рд░реНрдЧ __annotations__ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  • рдСрдкрд░реЗрд╢рди cls.row_count += 1 рдЖрдкрдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛: рдРрд╕рд╛ рдХреИрд╕реЗ? рдЖрдЦрд┐рд░рдХрд╛рд░, row_count рдПрдХ Row рд╡рд░реНрдЧ рд╣реИ, рдЗрд╕рдореЗрдВ row_count рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдм рдХреБрдЫ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛ рд╣реИ - рдпрджрд┐ рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ - рдЕрдЧрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЗрдЯрд╛рдлрд╝реНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ: MetaRow.row_count += 1 ред

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


 rows = [ Row(name='Valentin', age=25), Row(name='Sergey', age=33), Row(name='Gosha'), ] print(' | '.join(Row.__header__)) for row in rows: print(row) 

 тДЦ | age | name 1 | 25 | Valentin 2 | 33 | Sergey 3 | N/A | Gosha 

рд╡реИрд╕реЗ, рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рдПрдХ рдЕрд▓рдЧ Sheet рд╡рд░реНрдЧ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ , рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП __prepare__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, __prepare__ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреИрд╕реЗ __prepare__ , рдФрд░ __prepare__ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдПрдВред рджреЗрдЦрддреЗ рд░рд╣реЛ!


рдкрд╛рдпрдерди рдореЗрдВ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕реЗрд╕ рдФрд░ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдореИрдВ рдЙрдиреНрдирдд рдкрд╛рдпрдерди рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред

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


All Articles