рдпрд╣ рд▓реЗрдЦ
рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИред
рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ рдмреВрд╕реНрдЯ.рдкрд╛рдпрдереЙрдиред рдЗрд╕ рдмрд╛рд░ рдХреНрд▓рд╛рд╕ рдХреА рдмрд╛рд░реА рд╣реИ, рдЬрд┐рд╕реЗ рди рддреЛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рди рд╣реА рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдВрдЪреА рд╕рдВрд░рдЪрдирд╛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред
рдФрд░ рд╣рдо C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдкрд╛рдпрдерди рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛ рди рджреЗред рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рдЬреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрдЪрд░реЗ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЖрдЗрдП рдЬрд╛рдиреЗ ...
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
рд╣рдо рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд╕реЗ рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдкреВрд░рдХ рдХрд░рдирд╛ рдХрд╛рдлреА рд╣реИред
рдЪрд▓реЛ рдПрдХрд▓ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреБрдЫ рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ:
single.hsingle.cppрдФрд░ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВ:
wrap.hрдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд┐рдЫрд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдмрдиреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рд╣рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдмрджрд▓реЗрдВрдЧреЗ:
wrap.cppрдФрд░ рдПрдХ рдЕрджреНрднреБрдд рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЕрджреНрднреБрдд рдлрд╛рдЗрд▓реЗрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЗрддрдиреА рдорджрдж рдХреА, рд╡реЗ рд╡реИрд╕реЗ рд╣реА рд░рд╣реЗрдВрдЧреЗ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рд╣реИрдВ:
some.hsome.cppрдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрд░рдЪрдирд╛ рд▓рдкреЗрдЯреЗрдВ
рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕рд┐рдВрдЧрд▓.рдПрдЪ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА-рд╢реИрд▓реА рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ, рдмрд╕ рдЦреЗрддреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рдеред
рдордЬрд╝реЗ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдмрд▓реНрдХрд┐ рдХреБрдЫ рд░рд╣рд╕реНрдпрдордп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛:
struct Config { double coef; string path; int max_size; Config( double def_coef, string const& def_path, int def_max_size ); };
рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд░рдЪрдирд╛рдХрд╛рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдврд╝рд╛рд╡рд╛ :: python :: init <...> (...) рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :: python - рдЖрд╡рд░рдг рдЖрд╡рд░рдг рдЯреЗрдореНрдкрд▓реЗрдЯ:
class_<Config>( "Config", init<double,string,int>( args( "coef", "path", "max_size" ) ) .add_property( "coef", make_getter( &Config::coef ), make_setter( &Config::coef ) ) .add_property( "path", make_getter( &Config::path ), make_setter( &Config::path ) ) .add_property( "max_size", make_getter( &Config::max_size ), make_setter( &Config::max_size ) ) ;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП return_value_policy <copy_const_reference> рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣рд╛рдВ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореВрд▓реНрдп рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдирдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред
Make_setter рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЗрдирдкреБрдЯ рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЬрдЧрд░ рдореЗрдВ рдХреЙрдлрд╝ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдпрд╛ рдПрдХ рдлрд╝реНрд▓реЛрдЯ рдорд╛рди рдХреЗ рд▓рд┐рдП max_size рд╕реЗрдЯ рдХрд░реЗрдВ, рдПрдХ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдлрд╝реАрд▓реНрдб рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреВрд░реНрдг-рдкрд╛рдпрдерди рд╡рд░реНрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЦреИрд░, рд▓рдЧрднрдЧ рдкреВрд░реНрдг-рднрд╛рдЧ ... рдЪрд▓реЛ, рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдХреБрдЫ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдЖрд╡рд░рдг рдХреЗ рд▓рд┐рдП __str__ рдФрд░ __repr__ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рде рд╣реА рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдорд╛рдирдХ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП as_dict рдЧреБрдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред
рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛, рд╕рд╛рде рд╣реА рдкреБрд░рд╛рдиреЗ рд╡рд╛рд▓реЗ, рд╣рдорд╛рд░реА рдирдИ рд▓рдкреЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред h рдлрд╛рдЗрд▓:
#pragma once #include <boost/python.hpp> #include "some.h" #include "single.h" using namespace boost::python; string Some_Str( Some const& ); string Some_Repr( Some const& ); dict Some_ToDict( Some const& ); void Some_FromDict( Some&, dict const& ); string Config_Str( Config const& ); string Config_Repr( Config const& ); dict Config_ToDict( Config const& ); void Config_FromDict( Config&, dict const& );
рд░реИрдк.рдХреИрдк рдлрд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рднреА рдЕрддрд┐рд╢реНрдпреЛрдХреНрддрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рддреБрд░рдВрдд рдЙрджрд╛рд╣рд░рдг рдореЙрдбреНрдпреВрд▓ рдХреА рдШреЛрд╖рдгрд╛ рд╣реЛрдЧреА, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдардиреАрдпрддрд╛ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
Wra.cpp рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛:
string Config_Str( Config const& config ) { stringstream output; output << "{ coef: " << config.coef << ", path: '" << config.path << "', max_size: " << config.max_size << " }"; return output.str(); } string Config_Repr( Config const& config ) { return "Config: " + Config_Str( config ); } dict Config_ToDict( Config const& config ) { dict res; res["coef"] = config.coef; res["path"] = config.path; res["max_size"] = config.max_size; return res; } void Config_FromDict( Config& config, dict const& src ) { if( src.has_key( "coef" ) ) config.coef = extract<double>( src["coef"] ); if( src.has_key( "path" ) ) config.path = extract<string>( src["path"] ); if( src.has_key( "max_size" ) ) config.max_size = extract<int>( src["max_size"] ); }
рдмреЗрд╢рдХ, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╕рд╛ рдХреЗ рд╕рд╛рде рдПрдореЛрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЕрддреАрдд рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╣реЗрдВрдЧреЗред
рдмреЗрд╢рдХ, рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдЖрд╡рд░рдг рдореЗрдВ рдирдИ рдШреЛрд╖рдгрд╛рдПрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
class_<Config>( "Config", init<double,string,int>( args( "coef", "path", "max_size" ) ) ) .add_property( "coef", make_getter( &Config::coef ), make_setter( &Config::coef ) ) .add_property( "path", make_getter( &Config::path ), make_setter( &Config::path ) ) .add_property( "max_size", make_getter( &Config::max_size ), make_setter( &Config::max_size ) ) .def( "__str__", Config_Str ) .def( "__repr__", Config_Repr ) .add_property( "as_dict", Config_ToDict, Config_FromDict ) ;
рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдЕрджреНрднреБрдд рдкрд╛рдпрдерди рд╡рд░реНрдЧ рдирд┐рдХрд▓рд╛, рд╕реА ++ рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЬрдЧрд░ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рднрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реА рд╕рдордп рдЗрд╕реЗ "рдЙрдкрдпреЛрдЧреА" рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд░реНрдЧ рдЖрд╡рд░рдг рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛
рддреЛ рд╕рд┐рдВрдЧрд▓рдЯрдиред рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреВрд░реНрд╡реЛрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрд╛рджреВ рдХрд╛рдЙрдВрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рджреЗрдВред
class Single { public: static int CurrentID(); static Config& AppConfig(); static void AppConfig( Config const& ); private: int mCurrentID; Config mAppConfig; Single(); Single( Single const& ); static Single& Instance(); int ThisCurrentID(); Config& ThisAppConfig(); void ThisAppConfig( Config const& ); };
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдмреЗрдХрд╛рд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ () рдкрджреНрдзрддрд┐ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдФрд░ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рд╕реЗ, рд╕рд┐рдВрдЧрд▓рдЯрди рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЗрдВрд╕реНрдЯреЗрдВрд╕ () рдХреЙрд▓ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рджреЗрдЧрд╛ред
рдпрд╣рд╛рдБ
single.cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
#include "single.h" #include <boost/thread.hpp> using boost::mutex; using boost::unique_lock; const double CONFIG_DEFAULT_COEF = 2.5; const int CONFIG_DEFAULT_MAX_SIZE = 0x1000; const string CONFIG_DEFAULT_PATH = "."; int Single::CurrentID() { return Instance().ThisCurrentID(); } Config& Single::AppConfig() { return Instance().ThisAppConfig(); } void Single::AppConfig( Config const& config ) { Instance().ThisAppConfig( config ); } Single::Single() : mCurrentID( 0 ) { mAppConfig.coef = CONFIG_DEFAULT_COEF; mAppConfig.max_size = CONFIG_DEFAULT_MAX_SIZE; mAppConfig.path = CONFIG_DEFAULT_PATH; } Single& Single::Instance() { static mutex single_mutex; unique_lock<mutex> single_lock( single_mutex ); static Single instance; return instance; } int Single::ThisCurrentID() { static mutex id_mutex; unique_lock<mutex> id_lock( id_mutex ); return ++mCurrentID; } Config& Single::ThisAppConfig() { return mAppConfig; } void Single::ThisAppConfig( Config const& config ) { mAppConfig = config; }
рдХреЗрд╡рд▓ рддреАрди рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рд╣реИрдВ, рд░реИрдкрд░ рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди ... рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд╣реАрдВ, рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ:
1. рдЖрдк рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ
2. рдЖрдк рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ
3. рд╣рдордиреЗ рдЕрднреА рддрдХ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдирд╣реАрдВ рд▓рдкреЗрдЯрд╛ рд╣реИ
class_<Single, noncopyable>( "Single", no_init ) .def( "CurrentID", &Single::CurrentID ) .staticmethod( "CurrentID" ) .def( "AppConfig", static_cast< Config& (*)() >( &Single::AppConfig ), return_value_policy<reference_existing_object>() ) .def( "AppConfig", static_cast< void (*)( Config const& ) >( &Single::AppConfig ) ) .staticmethod( "AppConfig" ) ;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, 1 рдФрд░ 2 рдЕрдВрдХ рд╕реЗ рдЬреБрдбрд╝реА рд╕рднреА рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░
рдмреВрд╕реНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреА рд╣реИрдВ
:: рдЧреИрд░ -
рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░
рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП :: python :: no_init рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП :: python / class_ред
рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд▓рд╛рд╕ рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗ рдпрд╛ рдПрдХ рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛ, рддреЛ рдЖрдк рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдЗрд▓реЗрдВрд╕рд░ рдХреЛ рдорд┐рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ
.def (init <> ()) рд╕реЗ рдиреАрдЪреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рддреЛ рдЕрд▓рдЧ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде
рд╕реБрд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рднреА рдХрд░рддреЗ рд╣реИрдВ, рд░реИрдкрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рднреА
no_init рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред
рддреАрд╕рд░реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ рдХрд┐ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рднреА рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд░реИрдкрд░ () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
.staticmethod () рдореЗрдВ
рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╛рдХреА рд▓реЛрдЧ рдЕрдм рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдЙрдард╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рднрд╛рдЧ рд╕реЗ рд╣рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдПрдХ рдордЬрд╝реЗрджрд╛рд░ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рдХреЗ рд▓рд┐рдП - рд╡рд╛рдкрд╕реА рдХреА рдиреАрддрд┐_рд╡рд╛рд▓реНрдпреВ_рдкреЛрд▓рд┐рд╢ <рд╕рдВрджрд░реНрдн_рдПрдХреНрд╕рд┐рд╕реНрдЯреЗрдВрдЯ_рдмреЙрдЬ> рдорд╛рди рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рдж рдореЗрдВред
рдиреАрддрд┐ "рдореБрдЭреЗ рдордд рдорд╛рд░реЛ, рдореИрдВ рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╣реВрдБ"
рд╣рдорд╛рд░реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдХрдард┐рдирд╛рдИ рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╕реНрддреБ рд╕рдВрджрд░реНрдн рдХреА рд╡рд╛рдкрд╕реА рдереА
static Config& AppConfig();
рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХрд╛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ (рдЬреАрд╕реА) рд╡рд┐рдзрд┐ рд╕реЗ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИ, рд╣рдо
рд░рд┐рдЯрд░реНрди_рд╡рд▓реНрдпреВ_рдкреЛрд▓рд┐рд╢ <рд╕рдВрджрд░реНрдн_existing_object> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
Boost.Python рдХрд╛ рдЬрд╛рджреВ рдЗрддрдирд╛ рдХрдареЛрд░ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк Python рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ AppConfig () рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ C ++ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рдерд╛! рдкрд╛рдпрдерди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЪрд▓рд╛рдХрд░:
from example import * Single.AppConfig().coef = 123.45 Single.AppConfig()
рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:
Config: { coef: 123.45, path: '.', max_size: 4096 }
рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ
рд╢рд╛рдпрдж рд╕рднреА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдпрд╛ рджреЛ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ рддрд╛рдХрд┐ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЙрдЧреНрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм, рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдХрд▓ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдкрдврд╝рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдг рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВред
.add_static_property( "current_id", &Single::CurrentID ) .add_static_property( "app_config", make_function( static_cast< Config& (*)() >( &Single::AppConfig ), return_value_policy<reference_existing_object>() ), static_cast< void (*)( Config const& ) >( &Single::AppConfig ) )
рдПрдХрд▓ :: рдХрд░рдВрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдпрд╛ рджреЛ рдХреЗ рд▓рд┐рдП
рдХрд░рдВрдЯ_рдб рдкреНрд░реЙрдкрд░реНрдЯреА рджреНрд╡рд╛рд░рд╛ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХрд▓ рдХреЗ рджреЛ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ "рд╕реБрдВрджрд░" рдЖрд╡рд░рдг рдХреНрдпрд╛ рд╣реИ: AppConfig, рдХреНрд░рдорд╢рдГ, рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░
app_config рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕реЗрдЯ-рддрд░реАрдХреЗред рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ
get_value_policy <reference_existing_object> рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ
рдкреЙрд▓рд┐рд╕реА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖
рдореЗрдХ_рдлрдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред
рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдЖрдк
рдореЗрдХ_рдЧреЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ C ++ рд╡рд░реНрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рддрд░реАрдХреЗ рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкреЙрд▓рд┐рд╕реА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ
рдореЗрдХ_рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕
.def рдХреЗ рд░реВрдк рдореЗрдВ
return_value_policy рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдиреАрддрд┐ "рдпрд╣рд╛рдВ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╣реИ - рдЗрд╕реЗ рд╣рдЯрд╛рдПрдВ"
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдЕрдЬрдЧрд░ рдЬреАрд╕реА рдХреЛ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЛ рдЕрдЬрдЧрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдкрдХреЗ рдкрд░рд┐рдгрд╛рдо
рдореЗрдВ рдкреАрдбрд╝рд╛ рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░ рдХреЗ
рд░реВрдк рдореЗрдВ рдЬреИрд╕реЗ рд╣реА рдЬреАрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ
return_value_policy <manage_new_object> рдкреЙрд▓рд┐рд╕реА рд╣реИред
рдЖрдЗрдП рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬреЛ рдПрдХ рдирдП рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреНрд▓реЛрди рдХрд░рддрд╛ рд╣реИред рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЬреЛрдбрд╝реЗрдВред
Config* Single_CloneAppConfig();
рдФрд░ wra.cpp рдореЗрдВ рд╣рдо рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
Config* Single_CloneAppConfig() { return new Config( Single::AppConfig() ); }
рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде manage_new_object рдиреАрддрд┐ рддрджрдиреБрд╕рд╛рд░ рдПрдХрд▓ рд╡рд░реНрдЧ рдХреЗ рдЖрд╡рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
.def( "CloneAppConfig", Single_CloneAppConfig, return_value_policy<manage_new_object>() )
рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рд╕реА-рд╢реИрд▓реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ, рд╣рдо рдмрд╕ рд╕реНрдЯреИрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ STDOUT рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдЯрд╛рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
Config::~Config() { cout << "Config destructor of Config: { coef: " << coef << ", path: '" << path << "', max_size: " << max_size << " }" << endl; }
рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ!
рдкрд╛рдпрдерди 3.x рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рд╣рдо рдХреЙрдиреНрдлрд┐рдЧ рдХреЛ рдХреНрд▓реЛрди рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░
CloneAppConfig () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
from example import * c = Single.CloneAppConfig() c.coef = 11.11; c.path = 'cloned'; c.max_size = 111111 print( "c.coef = 12.34; c.path = 'cloned'; c.max_size = 100500" ) print( "c:", c ); print( "Single.AppConfig():", Single.AppConfig() ) print( "c = Single.CloneAppConfig()" ); c = Single.CloneAppConfig() c.coef = 22.22; c.path = 'another'; c.max_size = 222222 print( "c.coef = 22.22; c.path = 'another'; c.max_size = 222222" ) print( "c:", c ); print( "Single.app_config:", Single.app_config ) print( "c = None" ); c = None print( "Single.app_config:", Single.app_config )
рд╡рд┐рдирд╛рд╢рдХреЛрдВ рдХреЛ рдареАрдХ рдЙрд╕реА рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдВрддрд┐рдо рд▓рд┐рдВрдХ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
c.coef = 12.34; c.path = 'cloned'; c.max_size = 100500 c: { coef: 11.11, path: 'cloned', max_size: 111111 } Single.AppConfig(): { coef: 2.5, path: '.', max_size: 4096 } c = Single.CloneAppConfig() Config::~Config() destructor of object: { coef: 11.11, path: 'cloned', max_size: 111111 } c.coef = 22.22; c.path = 'another'; c.max_size = 222222 c: { coef: 22.22, path: 'another', max_size: 222222 } Single.app_config: { coef: 2.5, path: '.', max_size: 4096 } c = None Config::~Config() destructor of object: { coef: 22.22, path: 'another', max_size: 222222 } Single.app_config: { coef: 2.5, path: '.', max_size: 4096 } Config::~Config() destructor of object: { coef: 2.5, path: '.', max_size: 4096 }
рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд░реИрдкрд░ рдореЗрдВ __del__ рдкрджреНрдзрддрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ - рдкрд╛рдпрдерди рдореЗрдВ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд░реИрдкрд░ рдФрд░ рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╡реЗ рд╕рдВрджрд░реНрднрд┐рдд рд╣реИрдВ, рд╡рд┐рдкрд░реАрдд рд╣реИрдВред
рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рджреЛ рдирдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдиреАрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдП:
reference_existing_object рдФрд░
manage_new_object ред рдпрд╣реА рд╣реИ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реИрдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ C ++ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ GC Python рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рджреЗрдЦрднрд╛рд▓ рдореЗрдВ рднреА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рдордиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдпрджрд┐ C ++ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓рдЧрд╛рдП рдЧрдП рд╣реИрдВ рддреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдпрд╛ рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рдЪ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдпрдж рдЖрдкрдХреА рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рд╣реИрдВред
рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдПрдХ рд╕рд░рд▓ рдПрдирдо рд░реИрдкрд░ рд╣рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рдо C ++ рд╕реЗ рдкрд╛рдпрдерди рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХрдирд╡рд░реНрдЯрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рднреА рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрдирдХреЗ рд░реИрдкрд░ рдХреЗ рд╕реНрддрд░ рдкрд░ C ++ рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдЕрдЧрд▓рд╛, рд╣рдо C ++ рд╕реЗ рдкрд╛рдпрдерди рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╛рджреБрдИ рджреБрдирд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореЗрд░реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рд╡рд┐рд╖рдп рдПрдХ рдЧреЗрдВрдж рдХреА рддрд░рд╣ рдШреВрдорддрд╛ рд╣реИ: рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ, рдЬрдм рддрдХ рдЖрдк рдЗрд╕реЗ рдЦреЛрд▓рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗ ...
2 рднрд╛рдЧ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд▓рд┐рдВрдХ
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред MSVS v11 рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдЬрд┐рд╕реЗ Python 3.3 x64 рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
Boost.Python рдкреНрд░рд▓реЗрдЦрдирд░реИрдкрд░ рд╡рд░реНрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛ :: рдЕрдЬрдЧрд░ :: рд╡рд░реНрдЧ_
Boost.Python рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рдиреАрддрд┐рдпрд╛рдВрд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдмреВрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛* рдирд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдмреВрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛Boost.Python рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛