ºìÁªLinuxÃÅ»§
Linux°ïÖú

LINUXÓ¦Óü¼ÇÉ£¬ÐòÁл¯´æ´¢Python¶ÔÏó

·¢²¼Ê±¼ä:2006-07-05 00:12:42À´Ô´:ºìÁª×÷Õß:yy123
¡¡¡¡Ê²Ã´Êdz־ÃÐÔ£¿
¡¡¡¡³Ö¾ÃÐԵĻù±¾Ë¼ÏëºÜ¼òµ¥¡£¼Ù¶¨ÓÐÒ»¸ö Python ³ÌÐò£¬Ëü¿ÉÄÜÊÇÒ»¸ö¹ÜÀíÈÕ³£´ý°ìÊÂÏîµÄ³ÌÐò£¬ÄúÏ£ÍûÔÚ¶à´ÎÖ´ÐÐÕâ¸ö³ÌÐòÖ®¼ä¿ÉÒÔ±£´æÓ¦ÓóÌÐò¶ÔÏ󣨴ý°ìÊÂÏ¡£»»¾ä»°Ëµ£¬ÄúÏ£Íû½«¶ÔÏó´æ´¢ÔÚ´ÅÅÌÉÏ£¬±ãÓÚÒÔºó¼ìË÷¡£Õâ¾ÍÊdz־ÃÐÔ¡£Òª´ïµ½Õâ¸öÄ¿µÄ£¬Óм¸ÖÖ·½·¨£¬Ã¿Ò»ÖÖ·½·¨¶¼ÓÐÆäÓÅȱµã¡£
¡¡¡¡
¡¡¡¡ÀýÈ磬¿ÉÒÔ½«¶ÔÏóÊý¾Ý´æ´¢ÔÚijÖÖ¸ñʽµÄÎı¾ÎļþÖУ¬Æ©Èç CSV Îļþ¡£»òÕß¿ÉÒÔÓùØϵÊý¾Ý¿â£¬Æ©Èç Gadfly¡¢MySQL¡¢PostgreSQL »òÕß DB2¡£ÕâЩÎļþ¸ñʽºÍÊý¾Ý¿â¶¼·Ç³£ÓÅÐ㣬¶ÔÓÚËùÓÐÕâЩ´æ´¢»úÖÆ£¬Python ¶¼Óн¡×³µÄ½Ó¿Ú¡£
¡¡¡¡
¡¡¡¡ÕâЩ´æ´¢»úÖƶ¼ÓÐÒ»¸ö¹²Í¬µã£º´æ´¢µÄÊý¾ÝÊǶÀÁ¢ÓÚ¶ÔÕâЩÊý¾Ý½øÐвÙ×÷µÄ¶ÔÏóºÍ³ÌÐò¡£ÕâÑù×öµÄºÃ´¦ÊÇ£¬Êý¾Ý¿ÉÒÔ×÷Ϊ¹²ÏíµÄ×ÊÔ´£¬¹©ÆäËüÓ¦ÓóÌÐòʹÓá£È±µãÊÇ£¬ÓÃÕâÖÖ·½Ê½£¬¿ÉÒÔÔÊÐíÆäËü³ÌÐò·ÃÎʶÔÏóµÄÊý¾Ý£¬ÕâÎ¥±³ÁËÃæÏò¶ÔÏóµÄ·â×°ÐÔÔ­Ôò -- ¼´¶ÔÏóµÄÊý¾ÝÖ»ÄÜͨ¹ýÕâ¸ö¶ÔÏó×ÔÉíµÄ¹«¹²£¨public£©½Ó¿ÚÀ´·ÃÎÊ¡£
¡¡¡¡
¡¡¡¡ÁíÍ⣬¶ÔÓÚijЩӦÓóÌÐò£¬¹ØϵÊý¾Ý¿â·½·¨¿ÉÄܲ»ÊǺÜÀíÏë¡£ÓÈÆäÊÇ£¬¹ØϵÊý¾Ý¿â²»Àí½â¶ÔÏó¡£Ïà·´£¬¹ØϵÊý¾Ý¿â»áÇ¿ÐÐʹÓÃ×Ô¼ºµÄÀàÐÍϵͳºÍ¹ØϵÊý¾ÝÄ£ÐÍ£¨±í£©£¬Ã¿Õűí°üº¬Ò»×éÔª×飨ÐУ©£¬Ã¿Ðаüº¬¾ßÓй̶¨ÊýÄ¿µÄ¾²Ì¬ÀàÐÍ×ֶΣ¨ÁУ©¡£Èç¹ûÓ¦ÓóÌÐòµÄ¶ÔÏóÄ£ÐͲ»Äܹ»·½±ãµØת»»µ½¹ØϵģÐÍ£¬ÄÇôÔÚ½«¶ÔÏóÓ³Éäµ½Ôª×éÒÔ¼°½«Ôª×éÓ³Éä»Ø¶ÔÏó·½Ã棬»áÅöµ½Ò»¶¨ÄѶȡ£ÕâÖÖÀ§Äѳ£±»³ÆΪ×è°­ÐÔ²»Æ¥Å䣨impedence-mismatch£©ÎÊÌâ¡£
¡¡¡¡
¡¡¡¡¶ÔÏó³Ö¾ÃÐÔ
¡¡¡¡Èç¹ûÏ£Íû͸Ã÷µØ´æ´¢ Python ¶ÔÏ󣬶ø²»¶ªÊ§ÆäÉí·ÝºÍÀàÐ͵ÈÐÅÏ¢£¬ÔòÐèҪijÖÖÐÎʽµÄ¶ÔÏóÐòÁл¯£ºËüÊÇÒ»¸ö½«ÈÎÒ⸴ÔӵĶÔÏóת³É¶ÔÏóµÄÎı¾»ò¶þ½øÖƱíʾµÄ¹ý³Ì¡£Í¬Ñù£¬±ØÐëÄܹ»½«¶ÔÏó¾­¹ýÐòÁл¯ºóµÄÐÎʽ»Ö¸´µ½Ô­ÓеĶÔÏó¡£ÔÚ Python ÖУ¬ÕâÖÖÐòÁл¯¹ý³Ì³ÆΪ pickle£¬¿ÉÒÔ½«¶ÔÏó pickle ³É×Ö·û´®¡¢´ÅÅÌÉϵÄÎļþ»òÕßÈκÎÀàËÆÓÚÎļþµÄ¶ÔÏó£¬Ò²¿ÉÒÔ½«ÕâЩ×Ö·û´®¡¢Îļþ»òÈκÎÀàËÆÓÚÎļþµÄ¶ÔÏó unpickle ³ÉÔ­À´µÄ¶ÔÏó¡£ÎÒÃǽ«ÔÚ±¾ÎĺóÃæÏêϸÌÖÂÛ pickle¡£
¡¡¡¡
¡¡¡¡¼Ù¶¨Äúϲ»¶½«ÈκÎÊÂÎﶼ±£´æ³É¶ÔÏ󣬶øÇÒÏ£Íû±ÜÃ⽫¶ÔÏóת»»³ÉijÖÖ»ùÓڷǶÔÏó´æ´¢µÄ¿ªÏú£»ÄÇô pickle Îļþ¿ÉÒÔÌṩÕâЩºÃ´¦£¬µ«ÓÐʱ¿ÉÄÜÐèÒª±ÈÕâÖÖ¼òµ¥µÄ pickle Îļþ¸ü½¡×³ÒÔ¼°¸ü¾ßÓпÉÉìËõÐÔµÄÊÂÎï¡£ÀýÈ磬ֻÓà pickle ²»Äܽâ¾öÃüÃûºÍ²éÕÒ pickle ÎļþÕâÑùµÄÎÊÌ⣬ÁíÍ⣬ËüÒ²²»ÄÜÖ§³Ö²¢·¢µØ·ÃÎʳ־ÃÐÔ¶ÔÏó¡£Èç¹ûÐèÒªÕâЩ·½ÃæµÄ¹¦ÄÜ£¬ÔòÒªÇóÖúÀàËÆÓÚ ZODB£¨Õë¶Ô Python µÄ Z ¶ÔÏóÊý¾Ý¿â£©ÕâÀàÊý¾Ý¿â¡£ZODB ÊÇÒ»¸ö½¡×³µÄ¡¢¶àÓû§µÄºÍÃæÏò¶ÔÏóµÄÊý¾Ý¿âϵͳ£¬ËüÄܹ»´æ´¢ºÍ¹ÜÀíÈÎÒ⸴Ô Python ¶ÔÏ󣬲¢Ö§³ÖÊÂÎñ²Ù×÷ºÍ²¢·¢¿ØÖÆ¡££¨Çë²ÎÔIJο¼×ÊÁÏ£¬ÒÔÏÂÔØ ZODB¡££©ÁîÈË×ã¹»¸ÐÐËȤµÄÊÇ£¬ÉõÖÁ ZODB Ò²ÒÀ¿¿ Python µÄ±¾»úÐòÁл¯ÄÜÁ¦£¬¶øÇÒÒªÓÐЧµØʹÓà ZODB£¬±ØÐë³ä·ÖÁ˽â pickle¡£
¡¡¡¡
¡¡¡¡ÁíÒ»ÖÖÁîÈ˸ÐÐËȤµÄ½â¾ö³Ö¾ÃÐÔÎÊÌâµÄ·½·¨ÊÇ Prevayler£¬Ëü×î³õÊÇÓà Java ʵÏֵģ¨ÓÐ¹Ø Prevaylor ·½ÃæµÄ developerWorks ÎÄÕ£¬Çë²ÎÔIJο¼×ÊÁÏ£©¡£×î½ü£¬Ò»Èº Python ³ÌÐòÔ±½« Prevayler ÒÆÖ²µ½ÁË Python ÉÏ£¬ÁíÆðÃûΪ PyPerSyst£¬ÓÉ SourceForge Íйܣ¨ÓйØÖÁ PyPerSyst ÏîÄ¿µÄÁ´½Ó£¬Çë²ÎÔIJο¼×ÊÁÏ£©¡£Prevayler/PyPerSyst ¸ÅÄîÒ²Êǽ¨Á¢ÔÚ Java ºÍ Python ÓïÑԵı¾»úÐòÁл¯ÄÜÁ¦Ö®ÉÏ¡£PyPerSyst ½«Õû¸ö¶ÔÏóϵͳ±£´æÔÚÄÚ´æÖУ¬²¢Í¨¹ý²»Ê±µØ½«ÏµÍ³¿ìÕÕ pickle µ½´ÅÅÌÒÔ¼°Î¬»¤Ò»¸öÃüÁîÈÕÖ¾£¨Í¨¹ý´ËÈÕÖ¾¿ÉÒÔÖØÐÂÓ¦ÓÃ×îеĿìÕÕ£©À´ÌṩÔÖÄѻָ´¡£ËùÒÔ£¬¾¡¹ÜʹÓà PyPerSyst µÄÓ¦ÓóÌÐòÊܵ½¿ÉÓÃÄÚ´æµÄÏÞÖÆ£¬µ«ºÃ´¦ÊDZ¾»ú¶ÔÏóϵͳ¿ÉÒÔÍêȫװÈëµ½ÄÚ´æÖУ¬Òò¶øËٶȼ«¿ì£¬¶øÇÒʵÏÖÆðÀ´Òª±ÈÈç ZODB ÕâÑùµÄÊý¾Ý¿â¼òµ¥£¬ZODB ÔÊÐí¶ÔÏóµÄÊýÄ¿±ÈͬʱÔÚÄÜÄÚ´æÖÐËù±£³ÖµÄ¶ÔÏóÒª¶à¡£
¡¡¡¡
¡¡¡¡¼ÈÈ»ÎÒÃÇÒѾ­¼òÒªÌÖÂÛÁË´æ´¢³Ö¾Ã¶ÔÏóµÄ¸÷ÖÖ·½·¨£¬ÄÇôÏÖÔÚ¸ÃÏêϸ̽ÌÖ pickle ¹ý³ÌÁË¡£ËäÈ»ÎÒÃÇÖ÷Òª¸ÐÐËȤµÄÊÇ̽Ë÷ÒÔ¸÷ÖÖ·½Ê½À´±£´æ Python ¶ÔÏ󣬶ø²»±Ø½«Æäת»»³ÉijÖÖÆäËü¸ñʽ£¬µ«ÎÒÃÇÈÔÈ»»¹ÓÐһЩÐèÒª¹Ø×¢µÄµØ·½£¬Æ©È磺ÈçºÎÓÐЧµØ pickle ºÍ unpickle ¼òµ¥¶ÔÏóÒÔ¼°¸´ÔÓ¶ÔÏ󣬰üÀ¨¶¨ÖÆÀàµÄʵÀý£»ÈçºÎά»¤¶ÔÏóµÄÒýÓ㬰üÀ¨Ñ­»·ÒýÓú͵ݹéÒýÓã»ÒÔ¼°ÈçºÎ´¦ÀíÀඨÒå·¢ÉúµÄ±ä»¯£¬´Ó¶øʹÓÃÒÔÇ°¾­¹ý pickle µÄʵÀýʱ²»»á·¢ÉúÎÊÌâ¡£ÎÒÃǽ«ÔÚËæºó¹ØÓÚ Python µÄ pickle ÄÜÁ¦Ì½ÌÖÖÐÉæ¼°ËùÓÐÕâЩÎÊÌâ¡£
¡¡¡¡
¡¡¡¡Ò»Ð©¾­¹ý pickle µÄ Python
¡¡¡¡pickle Ä£¿é¼°ÆäͬÀàÄ£¿é cPickle Ïò Python ÌṩÁË pickle Ö§³Ö¡£ºóÕßÊÇÓà C ±àÂëµÄ£¬Ëü¾ßÓиüºÃµÄÐÔÄÜ£¬¶ÔÓÚ´ó¶àÊýÓ¦ÓóÌÐò£¬ÍƼöʹÓøÃÄ£¿é¡£ÎÒÃǽ«¼ÌÐøÌÖÂÛ pickle£¬µ«±¾ÎĵÄʾÀýʵ¼ÊÊÇÀûÓÃÁË cPickle¡£ÓÉÓÚÆäÖдó¶àÊýʾÀýÒªÓà Python shell À´ÏÔʾ£¬ËùÒÔÏÈչʾһÏÂÈçºÎµ¼Èë cPickle£¬²¢¿ÉÒÔ×÷Ϊ pickle À´ÒýÓÃËü£º
¡¡¡¡
¡¡¡¡>>> import cPickle as pickle
¡¡¡¡ÏÖÔÚÒѾ­µ¼ÈëÁ˸ÃÄ£¿é£¬½ÓÏÂÀ´ÈÃÎÒÃÇ¿´Ò»Ï pickle ½Ó¿Ú¡£pickle Ä£¿éÌṩÁËÒÔϺ¯Êý¶Ô£ºdumps(object) ·µ»ØÒ»¸ö×Ö·û´®£¬Ëü°üº¬Ò»¸ö pickle ¸ñʽµÄ¶ÔÏó£»loads(string) ·µ»Ø°üº¬ÔÚ pickle ×Ö·û´®ÖеĶÔÏó£»dump(object, file) ½«¶ÔÏóдµ½Îļþ£¬Õâ¸öÎļþ¿ÉÒÔÊÇʵ¼ÊµÄÎïÀíÎļþ£¬µ«Ò²¿ÉÒÔÊÇÈκÎÀàËÆÓÚÎļþµÄ¶ÔÏó£¬Õâ¸ö¶ÔÏó¾ßÓÐ write() ·½·¨£¬¿ÉÒÔ½ÓÊܵ¥¸öµÄ×Ö·û´®²ÎÊý£»load(file) ·µ»Ø°üº¬ÔÚ pickle ÎļþÖеĶÔÏó¡£
¡¡¡¡
¡¡¡¡È±Ê¡Çé¿öÏ£¬dumps() ºÍ dump() ʹÓÿɴòÓ¡µÄ ASCII ±íʾÀ´´´½¨ pickle¡£Á½Õ߶¼ÓÐÒ»¸ö final ²ÎÊý£¨¿ÉÑ¡£©£¬Èç¹ûΪ True£¬Ôò¸Ã²ÎÊýÖ¸¶¨Óøü¿ìÒÔ¼°¸üСµÄ¶þ½øÖƱíʾÀ´´´½¨ pickle¡£loads() ºÍ load() º¯Êý×Ô¶¯¼ì²â pickle ÊǶþ½øÖƸñʽ»¹ÊÇÎı¾¸ñʽ¡£
¡¡¡¡
¡¡¡¡Çåµ¥ 1 ÏÔʾÁËÒ»¸ö½»»¥Ê½»á»°£¬ÕâÀïʹÓÃÁ˸ղÅËùÃèÊöµÄ dumps() ºÍ loads() º¯Êý£º
¡¡¡¡
¡¡¡¡Çåµ¥ 1. dumps() ºÍ loads() µÄÑÝʾ
¡¡¡¡Welcome To PyCrust 0.7.2 - The Flakiest Python Shell
¡¡¡¡Sponsored by Orbtech - Your source for Python programming expertise.
¡¡¡¡Python 2.2.1 (#1, Aug 27 2002, 10:22:32)
¡¡¡¡[GCC 3.2 (Mandrake Linux 9.0 3.2-1mdk)] on linux-i386
¡¡¡¡Type "copyright", "credits" or "license" for more information.
¡¡¡¡>>> import cPickle as pickle
¡¡¡¡>>> t1 = ('this is a string', 42, [1, 2, 3], None)
¡¡¡¡>>> t1
¡¡¡¡('this is a string', 42, [1, 2, 3], None)
¡¡¡¡>>> p1 = pickle.dumps(t1)
¡¡¡¡>>> p1
¡¡¡¡"(S'this is a string'\nI42\n(lp1\nI1\naI2\naI3\naNtp2\n."
¡¡¡¡>>> print p1
¡¡¡¡(S'this is a string'
¡¡¡¡I42
¡¡¡¡(lp1
¡¡¡¡I1
¡¡¡¡aI2
¡¡¡¡aI3
¡¡¡¡aNtp2
¡¡¡¡.
¡¡¡¡>>> t2 = pickle.loads(p1)
¡¡¡¡>>> t2
¡¡¡¡('this is a string', 42, [1, 2, 3], None)
¡¡¡¡>>> p2 = pickle.dumps(t1, True)
¡¡¡¡>>> p2
¡¡¡¡'(U\x10this is a stringK*]q\x01(K\x01K\x02K\x03eNtq\x02.'
¡¡¡¡>>> t3 = pickle.loads(p2)
¡¡¡¡>>> t3
¡¡¡¡('this is a string', 42, [1, 2, 3], None)
¡¡¡¡
¡¡¡¡×¢£º¸ÃÎı¾ pickle ¸ñʽºÜ¼òµ¥£¬ÕâÀï¾Í²»½âÊÍÁË¡£ÊÂʵÉÏ£¬ÔÚ pickle Ä£¿éÖмǼÁËËùÓÐʹÓõÄÔ¼¶¨¡£ÎÒÃÇ»¹Ó¦¸ÃÖ¸³ö£¬ÔÚÎÒÃǵÄʾÀýÖÐʹÓõĶ¼ÊǼòµ¥¶ÔÏó£¬Òò´ËʹÓöþ½øÖÆ pickle ¸ñʽ²»»áÔÚ½ÚÊ¡¿Õ¼äÉÏÏÔʾ³öÌ«´óµÄЧÂÊ¡£È»¶ø£¬ÔÚʵ¼ÊʹÓø´ÔÓ¶ÔÏóµÄϵͳÖУ¬Äú»á¿´µ½£¬Ê¹Óöþ½øÖƸñʽ¿ÉÒÔÔÚ´óСºÍËٶȷ½Ãæ´øÀ´ÏÔÖøµÄ¸Ä½ø¡£
¡¡¡¡
¡¡¡¡½ÓÏÂÀ´£¬ÎÒÃÇ¿´Ò»Ð©Ê¾Àý£¬ÕâЩʾÀýÓõ½ÁË dump() ºÍ load()£¬ËüÃÇʹÓÃÎļþºÍÀàËÆÎļþµÄ¶ÔÏó¡£ÕâЩº¯ÊýµÄ²Ù×÷·Ç³£ÀàËÆÓÚÎÒÃǸղÅËù¿´µ½µÄ dumps() ºÍ loads()£¬Çø±ðÔÚÓÚËüÃÇ»¹ÓÐÁíÒ»ÖÖÄÜÁ¦ -- dump() º¯ÊýÄÜÒ»¸ö½Ó×ÅÒ»¸öµØ½«¼¸¸ö¶ÔÏóת´¢µ½Í¬Ò»¸öÎļþ¡£Ëæºóµ÷Óà load() À´ÒÔͬÑùµÄ˳Ðò¼ìË÷ÕâЩ¶ÔÏó¡£Çåµ¥ 2 ÏÔʾÁËÕâÖÖÄÜÁ¦µÄʵ¼ÊÓ¦Óãº
¡¡¡¡
¡¡¡¡Çåµ¥ 2. dump() ºÍ load() ʾÀý
¡¡¡¡>>> a1 = 'apple'
¡¡¡¡>>> b1 = {1: 'One', 2: 'Two', 3: 'Three'}
¡¡¡¡>>> c1 = ['fee', 'fie', 'foe', 'fum']
¡¡¡¡>>> f1 = file('temp.pkl', 'wb')
¡¡¡¡>>> pickle.dump(a1, f1, True)
¡¡¡¡>>> pickle.dump(b1, f1, True)
¡¡¡¡>>> pickle.dump(c1, f1, True)
¡¡¡¡>>> f1.close()
¡¡¡¡>>> f2 = file('temp.pkl', 'rb')
¡¡¡¡>>> a2 = pickle.load(f2)
¡¡¡¡>>> a2
¡¡¡¡'apple'
¡¡¡¡>>> b2 = pickle.load(f2)
¡¡¡¡>>> b2
¡¡¡¡{1: 'One', 2: 'Two', 3: 'Three'}
¡¡¡¡>>> c2 = pickle.load(f2)
¡¡¡¡>>> c2
¡¡¡¡['fee', 'fie', 'foe', 'fum']
¡¡¡¡>>> f2.close()
¡¡¡¡
¡¡¡¡Pickle µÄÍþÁ¦
¡¡¡¡µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃǽ²ÊöÁ˹ØÓÚ pickle ·½ÃæµÄ»ù±¾ÖªÊ¶¡£ÔÚÕâÒ»½Ú£¬½«ÌÖÂÛһЩ¸ß¼¶ÎÊÌ⣬µ±Äú¿ªÊ¼ pickle ¸´ÔÓ¶ÔÏóʱ£¬»áÓöµ½ÕâЩÎÊÌ⣬ÆäÖаüÀ¨¶¨ÖÆÀàµÄʵÀý¡£ÐÒÔ˵ÄÊÇ£¬Python ¿ÉÒÔºÜÈÝÒ׵ش¦ÀíÕâÖÖÇéÐΡ£
¡¡¡¡
¡¡¡¡¿ÉÒÆÖ²ÐÔ
¡¡¡¡´Ó¿Õ¼äºÍʱ¼äÉÏ˵£¬Pickle ÊÇ¿ÉÒÆÖ²µÄ¡£»»¾ä»°Ëµ£¬pickle Îļþ¸ñʽ¶ÀÁ¢ÓÚ»úÆ÷µÄÌåϵ½á¹¹£¬ÕâÒâζ×Å£¬ÀýÈ磬¿ÉÒÔÔÚ Linux Ï´´½¨Ò»¸ö pickle£¬È»ºó½«Ëü·¢Ë͵½ÔÚ Windows »ò Mac OS ÏÂÔËÐÐµÄ Python ³ÌÐò¡£²¢ÇÒ£¬µ±Éý¼¶µ½¸üа汾µÄ Python ʱ£¬²»±Øµ£ÐÄ¿ÉÄÜÒª·ÏÆúÒÑÓÐµÄ pickle¡£Python ¿ª·¢ÈËÔ±ÒѾ­±£Ö¤ pickle ¸ñʽ½«¿ÉÒÔÏòºó¼æÈÝ Python ¸÷¸ö°æ±¾¡£ÊÂʵÉÏ£¬ÔÚ pickle Ä£¿éÖÐÌṩÁËÓйØÄ¿Ç°ÒÔ¼°ËùÖ§³ÖµÄ¸ñʽ·½ÃæµÄÏêϸÐÅÏ¢£º
¡¡¡¡
¡¡¡¡Çåµ¥ 3. ¼ìË÷ËùÖ§³ÖµÄ¸ñʽ
¡¡¡¡>>> pickle.format_version
¡¡¡¡'1.3'
¡¡¡¡>>> pickle.compatible_formats
¡¡¡¡['1.0', '1.1', '1.2']
¡¡¡¡
¡¡¡¡¶à¸öÒýÓã¬Í¬Ò»¶ÔÏó
¡¡¡¡ÔÚ Python ÖУ¬±äÁ¿ÊǶÔÏóµÄÒýÓá£Í¬Ê±£¬Ò²¿ÉÒÔÓöà¸ö±äÁ¿ÒýÓÃͬһ¸ö¶ÔÏó¡£¾­Ö¤Ã÷£¬Python ÔÚÓþ­¹ý pickle µÄ¶ÔÏóά»¤ÕâÖÖÐÐΪ·½ÃæË¿ºÁûÓÐÀ§ÄÑ£¬ÈçÇåµ¥ 4 Ëùʾ£º
¡¡¡¡
¡¡¡¡Çåµ¥ 4. ¶ÔÏóÒýÓõÄά»¤
¡¡¡¡>>> a = [1, 2, 3]
¡¡¡¡>>> b = a
¡¡¡¡>>> a
¡¡¡¡[1, 2, 3]
¡¡¡¡>>> b
¡¡¡¡[1, 2, 3]
¡¡¡¡>>> a.append(4)
¡¡¡¡>>> a
¡¡¡¡[1, 2, 3, 4]
¡¡¡¡>>> b
¡¡¡¡[1, 2, 3, 4]
¡¡¡¡>>> c = pickle.dumps((a, b))
¡¡¡¡>>> d, e = pickle.loads(c)
¡¡¡¡>>> d
¡¡¡¡[1, 2, 3, 4]
¡¡¡¡>>> e
¡¡¡¡[1, 2, 3, 4]
¡¡¡¡>>> d.append(5)
¡¡¡¡>>> d
¡¡¡¡[1, 2, 3, 4, 5]
¡¡¡¡>>> e
¡¡¡¡[1, 2, 3, 4, 5]
¡¡¡¡
¡¡¡¡Ñ­»·ÒýÓú͵ݹéÒýÓÃ
¡¡¡¡¿ÉÒÔ½«¸Õ²ÅÑÝʾ¹ýµÄ¶ÔÏóÒýÓÃÖ§³ÖÀ©Õ¹µ½Ñ­»·ÒýÓã¨Á½¸ö¶ÔÏó¸÷×Ô°üº¬¶Ô¶Ô·½µÄÒýÓ㩺͵ݹéÒýÓã¨Ò»¸ö¶ÔÏó°üº¬¶ÔÆä×ÔÉíµÄÒýÓã©¡£ÏÂÃæÁ½¸öÇåµ¥×ÅÖØÏÔʾÕâÖÖÄÜÁ¦¡£ÎÒÃÇÏÈ¿´Ò»ÏµݹéÒýÓãº
¡¡¡¡
¡¡¡¡Çåµ¥ 5. µÝ¹éÒýÓÃ
¡¡¡¡>>> l = [1, 2, 3]
¡¡¡¡>>> l.append(l)
¡¡¡¡>>> l
¡¡¡¡[1, 2, 3, [...]]
¡¡¡¡>>> l[3]
¡¡¡¡[1, 2, 3, [...]]
¡¡¡¡>>> l[3][3]
¡¡¡¡[1, 2, 3, [...]]
¡¡¡¡>>> p = pickle.dumps(l)
¡¡¡¡>>> l2 = pickle.loads(p)
¡¡¡¡>>> l2
¡¡¡¡[1, 2, 3, [...]]
¡¡¡¡>>> l2[3]
¡¡¡¡[1, 2, 3, [...]]
¡¡¡¡>>> l2[3][3]
¡¡¡¡[1, 2, 3, [...]]
¡¡¡¡
¡¡¡¡ÏÖÔÚ£¬¿´Ò»¸öÑ­»·ÒýÓõÄʾÀý£º
¡¡¡¡
¡¡¡¡Çåµ¥ 6. Ñ­»·ÒýÓÃ
¡¡¡¡>>> a = [1, 2]
¡¡¡¡>>> b = [3, 4]
¡¡¡¡>>> a.append(b)
¡¡¡¡>>> a
¡¡¡¡[1, 2, [3, 4]]
¡¡¡¡>>> b.append(a)
¡¡¡¡>>> a
¡¡¡¡[1, 2, [3, 4, [...]]]
¡¡¡¡>>> b
¡¡¡¡[3, 4, [1, 2, [...]]]
¡¡¡¡>>> a[2]
¡¡¡¡[3, 4, [1, 2, [...]]]
¡¡¡¡>>> b[2]
¡¡¡¡[1, 2, [3, 4, [...]]]
¡¡¡¡>>> a[2] is b
¡¡¡¡1
¡¡¡¡>>> b[2] is a
¡¡¡¡1
¡¡¡¡>>> f = file('temp.pkl', 'w')
¡¡¡¡>>> pickle.dump((a, b), f)
¡¡¡¡>>> f.close()
¡¡¡¡>>> f = file('temp.pkl', 'r')
¡¡¡¡>>> c, d = pickle.load(f)
¡¡¡¡>>> f.close()
¡¡¡¡>>> c
¡¡¡¡[1, 2, [3, 4, [...]]]
¡¡¡¡>>> d
¡¡¡¡[3, 4, [1, 2, [...]]]
¡¡¡¡>>> c[2]
¡¡¡¡[3, 4, [1, 2, [...]]]
¡¡¡¡>>> d[2]
¡¡¡¡[1, 2, [3, 4, [...]]]
¡¡¡¡>>> c[2] is d
¡¡¡¡1
¡¡¡¡>>> d[2] is c
¡¡¡¡1
¡¡¡¡
¡¡¡¡×¢Ò⣬Èç¹û·Ö±ð pickle ÿ¸ö¶ÔÏ󣬶ø²»ÊÇÔÚÒ»¸öÔª×éÖÐÒ»Æð pickle ËùÓжÔÏ󣬻áµÃµ½ÂÔ΢²»Í¬£¨µ«ºÜÖØÒª£©µÄ½á¹û£¬ÈçÇåµ¥ 7 Ëùʾ£º
¡¡¡¡
¡¡¡¡Çåµ¥ 7. ·Ö±ð pickle vs. ÔÚÒ»¸öÔª×éÖÐÒ»Æð pickle
¡¡¡¡>>> f = file('temp.pkl', 'w')
¡¡¡¡>>> pickle.dump(a, f)
¡¡¡¡>>> pickle.dump(b, f)
¡¡¡¡>>> f.close()
¡¡¡¡>>> f = file('temp.pkl', 'r')
¡¡¡¡>>> c = pickle.load(f)
¡¡¡¡>>> d = pickle.load(f)
¡¡¡¡>>> f.close()
¡¡¡¡>>> c
¡¡¡¡[1, 2, [3, 4, [...]]]
¡¡¡¡>>> d
¡¡¡¡[3, 4, [1, 2, [...]]]
¡¡¡¡>>> c[2]
¡¡¡¡[3, 4, [1, 2, [...]]]
¡¡¡¡>>> d[2]
¡¡¡¡[1, 2, [3, 4, [...]]]
¡¡¡¡>>> c[2] is d
¡¡¡¡0
¡¡¡¡>>> d[2] is c
¡¡¡¡0
¡¡¡¡
¡¡¡¡ÏàµÈ£¬µ«²¢²»×ÜÊÇÏàͬ
¡¡¡¡ÕýÈçÔÚÉÏÒ»¸öʾÀýËù°µÊ¾µÄ£¬Ö»ÓÐÔÚÕâЩ¶ÔÏóÒýÓÃÄÚ´æÖÐͬһ¸ö¶ÔÏóʱ£¬ËüÃDzÅÊÇÏàͬµÄ¡£ÔÚ pickle ÇéÐÎÖУ¬Ã¿¸ö¶ÔÏó±»»Ö¸´µ½Ò»¸öÓëÔ­À´¶ÔÏóÏàµÈµÄ¶ÔÏ󣬵«²»ÊÇͬһ¸ö¶ÔÏó¡£»»¾ä»°Ëµ£¬Ã¿¸ö pickle ¶¼ÊÇÔ­À´¶ÔÏóµÄÒ»¸ö¸±±¾£º
¡¡¡¡
¡¡¡¡Çåµ¥ 8. ×÷ΪԭÀ´¶ÔÏ󸱱¾µÄ±»»Ö¸´µÄ¶ÔÏó
¡¡¡¡>>> j = [1, 2, 3]
¡¡¡¡>>> k = j
¡¡¡¡>>> k is j
¡¡¡¡1
¡¡¡¡>>> x = pickle.dumps(k)
¡¡¡¡>>> y = pickle.loads(x)
¡¡¡¡>>> y
¡¡¡¡[1, 2, 3]
¡¡¡¡>>> y == k
¡¡¡¡1
¡¡¡¡>>> y is k
¡¡¡¡0
¡¡¡¡>>> y is j
¡¡¡¡0
¡¡¡¡>>> k is j
¡¡¡¡1
¡¡¡¡
¡¡¡¡Í¬Ê±£¬ÎÒÃÇ¿´µ½ Python Äܹ»Î¬»¤¶ÔÏóÖ®¼äµÄÒýÓã¬ÕâЩ¶ÔÏóÊÇ×÷Ϊһ¸öµ¥Ôª½øÐÐ pickle µÄ¡£È»¶ø£¬ÎÒÃÇ»¹¿´µ½·Ö±ðµ÷Óà dump() »áʹ Python ÎÞ·¨Î¬»¤¶ÔÔڸõ¥ÔªÍⲿ½øÐÐ pickle µÄ¶ÔÏóµÄÒýÓá£Ïà·´£¬Python ¸´ÖÆÁ˱»ÒýÓöÔÏ󣬲¢½«¸±±¾ºÍ±» pickle µÄ¶ÔÏó´æ´¢ÔÚÒ»Æ𡣶ÔÓÚ pickle ºÍ»Ö¸´µ¥¸ö¶ÔÏó²ã´Î½á¹¹µÄÓ¦ÓóÌÐò£¬ÕâÊÇûÓÐÎÊÌâµÄ¡£µ«ÒªÒâʶµ½»¹ÓÐÆäËüÇéÐΡ£
¡¡¡¡
¡¡¡¡ÖµµÃÖ¸³öµÄÊÇ£¬ÓÐÒ»¸öÑ¡ÏîȷʵÔÊÐí·Ö±ð pickle ¶ÔÏ󣬲¢Î¬»¤Ï໥֮¼äµÄÒýÓã¬Ö»ÒªÕâЩ¶ÔÏó¶¼ÊÇ pickle µ½Í¬Ò»Îļþ¼´¿É¡£pickle ºÍ cPickle Ä£¿éÌṩÁËÒ»¸ö Pickler£¨Óë´ËÏà¶ÔÓ¦ÊÇ Unpickler£©£¬ËüÄܹ»¸ú×ÙÒѾ­±» pickle µÄ¶ÔÏó¡£Í¨¹ýʹÓÃÕâ¸ö Pickler£¬½«»áͨ¹ýÒýÓöø²»ÊÇͨ¹ýÖµÀ´ pickle ¹²ÏíºÍÑ­»·ÒýÓãº
¡¡¡¡
¡¡¡¡Çåµ¥ 9. ά»¤·Ö±ð pickle µÄ¶ÔÏó¼äµÄÒýÓÃ
¡¡¡¡>>> f = file('temp.pkl', 'w')
¡¡¡¡>>> pickler = pickle.Pickler(f)
¡¡¡¡>>> pickler.dump(a)
¡¡¡¡
¡¡¡¡>>> pickler.dump(b)
¡¡¡¡
¡¡¡¡>>> f.close()
¡¡¡¡>>> f = file('temp.pkl', 'r')
¡¡¡¡>>> unpickler = pickle.Unpickler(f)
¡¡¡¡>>> c = unpickler.load()
¡¡¡¡>>> d = unpickler.load()
¡¡¡¡>>> c[2]
¡¡¡¡[3, 4, [1, 2, [...]]]
¡¡¡¡>>> d[2]
¡¡¡¡[1, 2, [3, 4, [...]]]
¡¡¡¡>>> c[2] is d
¡¡¡¡1
¡¡¡¡>>> d[2] is c
¡¡¡¡1
¡¡¡¡
¡¡¡¡²»¿É pickle µÄ¶ÔÏó
¡¡¡¡Ò»Ð©¶ÔÏóÀàÐÍÊDz»¿É pickle µÄ¡£ÀýÈ磬Python ²»ÄÜ pickle Îļþ¶ÔÏ󣨻òÕßÈκδøÓжÔÎļþ¶ÔÏóÒýÓõĶÔÏ󣩣¬ÒòΪ Python ÔÚ unpickle ʱ²»Äܱ£Ö¤Ëü¿ÉÒÔÖؽ¨¸ÃÎļþµÄ״̬£¨ÁíÒ»¸öʾÀý±È½ÏÄѶ®£¬ÔÚÕâÀàÎÄÕÂÖв»ÖµµÃÌá³öÀ´£©¡£ÊÔͼ pickle Îļþ¶ÔÏó»áµ¼ÖÂÒÔÏ´íÎó£º
¡¡¡¡
¡¡¡¡Çåµ¥ 10. ÊÔͼ pickle Îļþ¶ÔÏóµÄ½á¹û
¡¡¡¡>>> f = file('temp.pkl', 'w')
¡¡¡¡>>> p = pickle.dumps(f)
¡¡¡¡Traceback (most recent call last):
¡¡¡¡File "", line 1, in ?
¡¡¡¡File "/usr/lib/python2.2/copy_reg.py", line 57, in _reduce
¡¡¡¡raise TypeError, "can't pickle %s objects" % base.__name__
¡¡¡¡TypeError: can't pickle file objects
¡¡¡¡
¡¡¡¡ÀàʵÀý
¡¡¡¡Óë pickle ¼òµ¥¶ÔÏóÀàÐÍÏà±È£¬pickle ÀàʵÀýÒª¶à¼ÓÁôÒâ¡£ÕâÖ÷ÒªÓÉÓÚ Python »á pickle ʵÀýÊý¾Ý£¨Í¨³£ÊÇ _dict_ ÊôÐÔ£©ºÍÀàµÄÃû³Æ£¬¶ø²»»á pickle ÀàµÄ´úÂë¡£µ± Python unpickle ÀàµÄʵÀýʱ£¬Ëü»áÊÔͼʹÓÃÔÚ pickle ¸ÃʵÀýʱµÄÈ·ÇеÄÀàÃû³ÆºÍÄ£¿éÃû³Æ£¨°üÀ¨ÈκΰüµÄ·¾¶Ç°×º£©µ¼Èë°üº¬¸ÃÀඨÒåµÄÄ£¿é¡£ÁíÍâҪעÒ⣬ÀඨÒå±ØÐë³öÏÖÔÚÄ£¿éµÄ×²ã£¬ÕâÒâζ×ÅËüÃDz»ÄÜÊÇǶÌ×µÄÀࣨÔÚÆäËüÀà»òº¯ÊýÖж¨ÒåµÄÀࣩ¡£
¡¡¡¡
¡¡¡¡µ± unpickle ÀàµÄʵÀýʱ£¬Í¨³£²»»áÔÙµ÷ÓÃËüÃÇµÄ _init_() ·½·¨¡£Ïà·´£¬Python ´´½¨Ò»¸öͨÓÃÀàʵÀý£¬²¢Ó¦ÓÃÒѽøÐйý pickle µÄʵÀýÊôÐÔ£¬Í¬Ê±ÉèÖøÃʵÀýµÄ _class_ ÊôÐÔ£¬Ê¹ÆäÖ¸ÏòÔ­À´µÄÀà¡£
¡¡¡¡
¡¡¡¡¶Ô Python 2.2 ÖÐÒýÈëµÄÐÂÐÍÀà½øÐÐ unpickle µÄ»úÖÆÓëÔ­À´µÄÂÔÓв»Í¬¡£ËäÈ»´¦ÀíµÄ½á¹ûʵ¼ÊÉÏÓë¶Ô¾ÉÐÍÀà´¦ÀíµÄ½á¹ûÏàͬ£¬µ« Python ʹÓà copy_reg Ä£¿éµÄ _reconstructor() º¯ÊýÀ´»Ö¸´ÐÂÐÍÀàµÄʵÀý¡£
¡¡¡¡
¡¡¡¡Èç¹ûÏ£Íû¶ÔÐÂÐÍ»ò¾ÉÐÍÀàµÄʵÀýÐÞ¸ÄȱʡµÄ pickle ÐÐΪ£¬Ôò¿ÉÒÔ¶¨ÒåÌØÊâµÄÀàµÄ·½·¨ _getstate_() ºÍ _setstate_()£¬ÔÚ±£´æºÍ»Ö¸´ÀàʵÀýµÄ״̬ÐÅÏ¢Æڼ䣬Python »áµ÷ÓÃÕâЩ·½·¨¡£ÔÚÒÔϼ¸½ÚÖУ¬ÎÒÃǻῴµ½Ò»Ð©Ê¾ÀýÀûÓÃÁËÕâЩÌØÊâµÄ·½·¨¡£
¡¡¡¡
¡¡¡¡ÏÖÔÚ£¬ÎÒÃÇ¿´Ò»¸ö¼òµ¥µÄÀàʵÀý¡£Ê×ÏÈ£¬´´½¨Ò»¸ö persist.py µÄ Python Ä£¿é£¬Ëü°üº¬ÒÔÏÂÐÂÐÍÀàµÄ¶¨Ò壺
¡¡¡¡
¡¡¡¡Çåµ¥ 11. ÐÂÐÍÀàµÄ¶¨Òå
¡¡¡¡class Foo(object):
¡¡¡¡
¡¡¡¡def __init__(self, value):
¡¡¡¡self.value = value
¡¡¡¡
¡¡¡¡ÏÖÔÚ¿ÉÒÔ pickle Foo ʵÀý£¬²¢¿´Ò»ÏÂËüµÄ±íʾ£º
¡¡¡¡
¡¡¡¡Çåµ¥ 12. pickle Foo ʵÀý
¡¡¡¡>>> import cPickle as pickle
¡¡¡¡>>> from Orbtech.examples.persist import Foo
¡¡¡¡>>> foo = Foo('What is a Foo?')
¡¡¡¡>>> p = pickle.dumps(foo)
¡¡¡¡>>> print p
¡¡¡¡ccopy_reg
¡¡¡¡_reconstructor
¡¡¡¡p1
¡¡¡¡(cOrbtech.examples.persist
¡¡¡¡Foo
¡¡¡¡p2
¡¡¡¡c__builtin__
¡¡¡¡object
¡¡¡¡p3
¡¡¡¡NtRp4
¡¡¡¡(dp5
¡¡¡¡S'value'
¡¡¡¡p6
¡¡¡¡S'What is a Foo?'
¡¡¡¡sb.
¡¡¡¡>>>
¡¡¡¡
¡¡¡¡¿ÉÒÔ¿´µ½Õâ¸öÀàµÄÃû³Æ Foo ºÍÈ«ÏÞ¶¨µÄÄ£¿éÃû³Æ Orbtech.examples.persist ¶¼´æ´¢ÔÚ pickle ÖС£Èç¹û½«Õâ¸öʵÀý pickle ³ÉÒ»¸öÎļþ£¬ÉÔºóÔÙ unpickle Ëü»òÔÚÁíһ̨»úÆ÷ÉÏ unpickle£¬Ôò Python »áÊÔͼµ¼Èë Orbtech.examples.persist Ä£¿é£¬Èç¹û²»Äܵ¼È룬Ôò»áÅ׳öÒì³£¡£Èç¹ûÖØÃüÃû¸ÃÀàºÍ¸ÃÄ£¿é»òÕß½«¸ÃÄ£¿éÒƵ½ÁíÒ»¸öĿ¼£¬ÔòÒ²»á·¢ÉúÀàËƵĴíÎó¡£
¡¡¡¡
¡¡¡¡ÕâÀïÓÐÒ»¸ö Python ·¢³ö´íÎóÏûÏ¢µÄʾÀý£¬µ±ÎÒÃÇÖØÃüÃû Foo À࣬ȻºóÊÔͼװÈëÏÈÇ°½øÐйý pickle µÄ Foo ʵÀýʱ»á·¢Éú¸Ã´íÎó£º
¡¡¡¡
¡¡¡¡Çåµ¥ 13. ÊÔͼװÈëÒ»¸ö±»ÖØÃüÃûµÄ Foo ÀàµÄ¾­¹ý pickle µÄʵÀý
¡¡¡¡>>> import cPickle as pickle
¡¡¡¡>>> f = file('temp.pkl', 'r')
¡¡¡¡>>> foo = pickle.load(f)
¡¡¡¡Traceback (most recent call last):
¡¡¡¡File "", line 1, in ?
¡¡¡¡AttributeError: 'module' object has no attribute 'Foo'
¡¡¡¡
¡¡¡¡ÔÚÖØÃüÃû persist.py Ä£¿éÖ®ºó£¬Ò²»á·¢ÉúÀàËƵĴíÎó£º
¡¡¡¡
¡¡¡¡Çåµ¥ 14. ÊÔͼװÈëÒ»¸ö±»ÖØÃüÃûµÄ persist.py Ä£¿éµÄ¾­¹ý pickle µÄʵÀý
¡¡¡¡>>> import cPickle as pickle
¡¡¡¡>>> f = file('temp.pkl', 'r')
¡¡¡¡>>> foo = pickle.load(f)
¡¡¡¡Traceback (most recent call last):
¡¡¡¡File "", line 1, in ?
¡¡¡¡ImportError: No module named persist
¡¡¡¡
¡¡¡¡ÎÒÃÇ»áÔÚÏÂÃæģʽ¸Ä½øÕâÒ»½ÚÌṩһЩ¼¼ÊõÀ´¹ÜÀíÕâÀà¸ü¸Ä£¬¶ø²»»áÆÆ»µÏÖÓÐµÄ pickle¡£
¡¡¡¡
¡¡¡¡ÌØÊâµÄ״̬·½·¨
¡¡¡¡Ç°ÃæÌáµ½¶ÔһЩ¶ÔÏóÀàÐÍ£¨Æ©È磬Îļþ¶ÔÏ󣩲»ÄܽøÐÐ pickle¡£´¦ÀíÕâÖÖ²»ÄÜ pickle µÄ¶ÔÏóµÄʵÀýÊôÐÔʱ¿ÉÒÔʹÓÃÌØÊâµÄ·½·¨£¨_getstate_() ºÍ _setstate_()£©À´ÐÞ¸ÄÀàʵÀýµÄ״̬¡£ÕâÀïÓÐÒ»¸ö Foo ÀàµÄʾÀý£¬ÎÒÃÇÒѾ­¶ÔËü½øÐÐÁËÐÞ¸ÄÒÔ´¦ÀíÎļþ¶ÔÏóÊôÐÔ£º
¡¡¡¡
¡¡¡¡Çåµ¥ 15. ´¦Àí²»ÄÜ pickle µÄʵÀýÊôÐÔ
¡¡¡¡class Foo(object):
¡¡¡¡
¡¡¡¡def __init__(self, value, filename):
¡¡¡¡self.value = value
¡¡¡¡self.logfile = file(filename, 'w')
¡¡¡¡
¡¡¡¡def __getstate__(self):
¡¡¡¡"""Return state values to be pickled."""
¡¡¡¡f = self.logfile
¡¡¡¡return (self.value, f.name, f.tell())
¡¡¡¡
¡¡¡¡def __setstate__(self, state):
¡¡¡¡"""Restore state from the unpickled state values."""
¡¡¡¡self.value, name, position = state
¡¡¡¡f = file(name, 'w')
¡¡¡¡f.seek(position)
¡¡¡¡self.logfile = f
¡¡¡¡
¡¡¡¡pickle Foo µÄʵÀýʱ£¬Python ½«Ö» pickle µ±Ëüµ÷ÓøÃʵÀýµÄ _getstate_() ·½·¨Ê±·µ»Ø¸øËüµÄÖµ¡£ÀàËƵģ¬ÔÚ unpickle ʱ£¬Python ½«Ìṩ¾­¹ý unpickle µÄÖµ×÷Ϊ²ÎÊý´«µÝ¸øʵÀýµÄ _setstate_() ·½·¨¡£ÔÚ _setstate_() ·½·¨ÄÚ£¬¿ÉÒÔ¸ù¾Ý¾­¹ý pickle µÄÃû³ÆºÍλÖÃÐÅÏ¢À´Öؽ¨Îļþ¶ÔÏ󣬲¢½«¸ÃÎļþ¶ÔÏó·ÖÅä¸øÕâ¸öʵÀýµÄ logfile ÊôÐÔ¡£
¡¡¡¡
¡¡¡¡Ä£Ê½¸Ä½ø
¡¡¡¡Ëæ×Åʱ¼äµÄÍÆÒÆ£¬Äú»á·¢ÏÖ×Ô¼º±ØÐëÒª¸ü¸ÄÀàµÄ¶¨Òå¡£Èç¹ûÒѾ­¶Ôij¸öÀàʵÀý½øÐÐÁË pickle£¬¶øÏÖÔÚÓÖÐèÒª¸ü¸ÄÕâ¸öÀ࣬ÔòÄú¿ÉÄÜÒª¼ìË÷ºÍ¸üÐÂÄÇЩʵÀý£¬ÒÔ±ãËüÃÇÄÜÔÚеÄÀඨÒåϼÌÐøÕý³£¹¤×÷¡£¶øÎÒÃÇÒѾ­¿´µ½ÔÚ¶ÔÀà»òÄ£¿é½øÐÐijЩ¸ü¸Äʱ£¬»á³öÏÖһЩ´íÎó¡£ÐÒÔ˵ÄÊÇ£¬pickle ºÍ unpickle ¹ý³ÌÌṩÁËһЩ hook£¬ÎÒÃÇ¿ÉÒÔÓÃËüÃÇÀ´Ö§³ÖÕâÖÖģʽ¸Ä½øµÄÐèÒª¡£
¡¡¡¡
¡¡¡¡ÔÚÕâÒ»½Ú£¬ÎÒÃǽ«Ì½ÌÖһЩ·½·¨À´Ô¤²â³£¼ûÎÊÌâÒÔ¼°ÈçºÎ½â¾öÕâЩÎÊÌâ¡£ÓÉÓÚ²»ÄÜ pickle ÀàʵÀý´úÂ룬Òò´Ë¿ÉÒÔÌí¼Ó¡¢¸ü¸ÄºÍ³ýÈ¥·½·¨£¬¶ø²»»áÓ°ÏìÏÖÓеľ­¹ý pickle µÄʵÀý¡£³öÓÚͬÑùµÄÔ­Òò£¬¿ÉÒÔ²»±Øµ£ÐÄÀàµÄÊôÐÔ¡£Äú±ØÐëÈ·±£°üº¬ÀඨÒåµÄ´úÂëÄ£¿éÔÚ unpickle »·¾³ÖпÉÓá£Í¬Ê±»¹±ØÐëΪÕâЩ¿ÉÄܵ¼Ö unpickle ÎÊÌâµÄ¸ü¸Ä×öºÃ¹æ»®£¬ÕâЩ¸ü¸Ä°üÀ¨£º¸ü¸ÄÀàÃû¡¢Ìí¼Ó»ò³ýȥʵÀýµÄÊôÐÔÒÔ¼°¸Ä±äÀඨÒåÄ£¿éµÄÃû³Æ»òλÖá£
¡¡¡¡
¡¡¡¡ÀàÃûµÄ¸ü¸Ä
¡¡¡¡Òª¸ü¸ÄÀàÃû£¬¶ø²»ÆÆ»µÏÈÇ°¾­¹ý pickle µÄʵÀý£¬Çë×ñÑ­ÒÔϲ½Öè¡£Ê×ÏÈ£¬È·±£Ô­À´µÄÀàµÄ¶¨ÒåûÓб»¸ü¸Ä£¬ÒÔ±ãÔÚ unpickle ÏÖÓÐʵÀýʱ¿ÉÒÔÕÒµ½Ëü¡£²»Òª¸ü¸ÄÔ­À´µÄÃû³Æ£¬¶øÊÇÔÚÓëÔ­À´ÀඨÒåËùÔÚµÄͬһ¸öÄ£¿éÖУ¬´´½¨¸ÃÀඨÒåµÄÒ»¸ö¸±±¾£¬Í¬Ê±¸øËüÒ»¸öеÄÀàÃû¡£È»ºóʹÓÃʵ¼ÊµÄÐÂÀàÃûÀ´Ìæ´ú NewClassName£¬½«ÒÔÏ·½·¨Ìí¼Óµ½Ô­À´ÀàµÄ¶¨ÒåÖУº
¡¡¡¡
¡¡¡¡Çåµ¥ 16. ¸ü¸ÄÀàÃû£ºÌí¼Óµ½Ô­À´ÀඨÒåµÄ·½·¨
¡¡¡¡def __setstate__(self, state):
¡¡¡¡self.__dict__.update(state)
¡¡¡¡self.__class__ = NewClassName
¡¡¡¡
¡¡¡¡µ± unpickle ÏÖÓÐʵÀýʱ£¬Python ½«²éÕÒÔ­À´ÀàµÄ¶¨Ò壬²¢µ÷ÓÃʵÀýµÄ _setstate_() ·½·¨£¬Í¬Ê±½«¸øеÄÀඨÒåÖØзÖÅä¸ÃʵÀýµÄ _class_ ÊôÐÔ¡£Ò»µ©È·¶¨ËùÓÐÏÖÓеÄʵÀý¶¼ÒѾ­ unpickle¡¢¸üкÍÖØРpickle ºó£¬¿ÉÒÔ´ÓÔ´´úÂëÄ£¿éÖгýÈ¥¾ÉµÄÀඨÒå¡£
¡¡¡¡
¡¡¡¡ÊôÐÔµÄÌí¼ÓºÍɾ³ý
¡¡¡¡ÕâЩÌØÊâµÄ״̬·½·¨ _getstate_() ºÍ _setstate_() ÔÙÒ»´ÎʹÎÒÃÇÄÜ¿ØÖÆÿ¸öʵÀýµÄ״̬£¬²¢Ê¹ÎÒÃÇÓлú»á´¦ÀíʵÀýÊôÐÔÖеĸü¸Ä¡£ÈÃÎÒÃÇ¿´Ò»¸ö¼òµ¥µÄÀàµÄ¶¨Ò壬ÎÒÃǽ«ÏòÆäÌí¼ÓºÍ³ýȥһЩÊôÐÔ¡£ÕâÊÇÊÇ×î³õµÄ¶¨Ò壺
¡¡¡¡
¡¡¡¡Çåµ¥ 17. ×î³õµÄÀඨÒå
¡¡¡¡class Person(object):
¡¡¡¡
¡¡¡¡def __init__(self, firstname, lastname):
¡¡¡¡self.firstname = firstname
¡¡¡¡self.lastname = lastname
¡¡¡¡
¡¡¡¡¼Ù¶¨ÒѾ­´´½¨²¢ pickle ÁË Person µÄʵÀý£¬ÏÖÔÚÎÒÃǾö¶¨ÕæµÄÖ»Ïë´æ´¢Ò»¸öÃû³ÆÊôÐÔ£¬¶ø²»ÊÇ·Ö±ð´æ´¢ÐÕºÍÃû¡£ÕâÀïÓÐÒ»ÖÖ·½Ê½¿ÉÒÔ¸ü¸ÄÀàµÄ¶¨Ò壬Ëü½«ÏÈÇ°¾­¹ý pickle µÄʵÀýǨÒƵ½ÐµĶ¨Ò壺
¡¡¡¡
¡¡¡¡Çåµ¥ 18. еÄÀඨÒå
¡¡¡¡class Person(object):
¡¡¡¡
¡¡¡¡def __init__(self, fullname):
¡¡¡¡self.fullname = fullname
¡¡¡¡
¡¡¡¡def __setstate__(self, state):
¡¡¡¡if 'fullname' not in state:
¡¡¡¡first = '
¡¡¡¡last = '
¡¡¡¡if 'firstname' in state:
¡¡¡¡first = state['firstname']
¡¡¡¡del state['firstname']
¡¡¡¡if 'lastname' in state:
¡¡¡¡last = state['lastname']
¡¡¡¡del state['lastname']
¡¡¡¡self.fullname = " ".join([first, last]).strip()
¡¡¡¡self.__dict__.update(state)
¡¡¡¡
¡¡¡¡ÔÚÕâ¸öʾÀý£¬ÎÒÃÇÌí¼ÓÁËÒ»¸öеÄÊôÐÔ fullname£¬²¢³ýÈ¥ÁËÁ½¸öÏÖÓеÄÊôÐÔ firstname ºÍ lastname¡£µ±¶ÔÏÈÇ°½øÐйý pickle µÄʵÀýÖ´ÐÐ unpickle ʱ£¬ÆäÏÈÇ°½øÐйý pickle µÄ״̬»á×÷Ϊ×ֵ䴫µÝ¸ø _setstate_()£¬Ëü½«°üÀ¨ firstname ºÍ lastname ÊôÐÔµÄÖµ¡£½ÓÏÂÀ´£¬½«ÕâÁ½¸öÖµ×éºÏÆðÀ´£¬²¢½«ËüÃÇ·ÖÅä¸øÐÂÊôÐÔ fullname¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬ÎÒÃÇɾ³ýÁË״̬×ÖµäÖоɵÄÊôÐÔ¡£¸üкÍÖØРpickle ÏÈÇ°½øÐйý pickle µÄËùÓÐʵÀýÖ®ºó£¬ÏÖÔÚ¿ÉÒÔ´ÓÀඨÒåÖгýÈ¥ _setstate_() ·½·¨¡£
¡¡¡¡
¡¡¡¡Ä£¿éµÄÐÞ¸Ä
¡¡¡¡ÔÚ¸ÅÄîÉÏ£¬Ä£¿éµÄÃû³Æ»òλÖõĸıäÀàËÆÓÚÀàÃû³ÆµÄ¸Ä±ä£¬µ«´¦Àí·½Ê½È´ÍêÈ«²»Í¬¡£ÄÇÊÇÒòΪģ¿éµÄÐÅÏ¢´æ´¢ÔÚ pickle ÖУ¬¶ø²»ÊÇͨ¹ý±ê×¼µÄ pickle ½Ó¿Ú¾Í¿ÉÒÔÐ޸ĵÄÊôÐÔ¡£ÊÂʵÉÏ£¬¸Ä±äÄ£¿éÐÅÏ¢µÄΨһ°ì·¨ÊǶÔʵ¼ÊµÄ pickle Îļþ±¾ÉíÖ´ÐвéÕÒºÍÌæ»»²Ù×÷¡£ÖÁÓÚÈçºÎÈ·ÇеØÈ¥×ö£¬ÕâÈ¡¾öÓÚ¾ßÌåµÄ²Ù×÷ϵͳºÍ¿ÉʹÓõŤ¾ß¡£ºÜÏÔÈ»£¬ÔÚÕâÖÖÇé¿öÏ£¬Äú»áÏ뱸·ÝÄúµÄÎļþ£¬ÒÔÃâ·¢Éú´íÎó¡£µ«ÕâÖָĶ¯Ó¦¸Ã·Ç³£¼òµ¥£¬²¢ÇÒ¶Ô¶þ½øÖÆ pickle ¸ñʽ½øÐиü¸ÄÓë¶ÔÎı¾ pickle ¸ñʽ½øÐиü¸ÄÓ¦¸ÃÒ»ÑùÓÐЧ¡£
¡¡¡¡
¡¡¡¡½áÊøÓï
¡¡¡¡¶ÔÏó³Ö¾ÃÐÔÒÀÀµÓڵײã±à³ÌÓïÑԵĶÔÏóÐòÁл¯ÄÜÁ¦¡£¶ÔÓÚ Python ¶ÔÏó¼´Òâζ×Å pickle¡£Python µÄ pickle Ϊ Python ¶ÔÏóÓÐЧµÄ³Ö¾ÃÐÔ¹ÜÀíÌṩÁ˽¡×³µÄºÍ¿É¿¿µÄ»ù´¡¡£ÔÚÏÂÃæµÄ²Î¿¼×ÊÁÏÖУ¬Äú½«»áÕÒµ½Óйؽ¨Á¢ÔÚ Python pickle ÄÜÁ¦Ö®ÉϵÄϵͳµÄÐÅÏ¢¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ