Python论坛  - 讨论区

标题:[python-chinese] Mixin 扫盲班

2007年06月18日 星期一 12:03

lai yonghao lanphaday在gmail.com
星期一 六月 18 12:03:46 HKT 2007

Mixin ɨä°à
˵(http://blog.csdn.net/lanphaday)

ÉùÃ÷£º±¾ÎÄÊʺϳõÖм¶Python³ÌÐòÔ±ÔĶÁ£¬ÁíÍâ±¾ÎÄ´ë´Ê¿ÉÄܻᵼÖÂÔĶÁÕß²»ÊÊ£¬¾´ÇëPG¡£

*Òý×Ó*
àÅ£¬ÎªÊ²Ã´ÒªÌ¸Mixin°¡£¿
ÒòΪ³öÏÖÁËMixinÕâÑùÒ»¸ö¶«Î÷ѽ£¬¾ÍÏñC++ÉçÇøºÜ¶àÈË̸ÂÛtemplateÒ»Ñù°¡£¬PythonÉçÇøÒ²ºÜ¶à»á̸ÂÛMixinµÄ£¨ÒÔºó»áµÄ£¬ÎûÎû£©£¬ËùÒÔÎÒ¾ÍÀ´´Õ´ÕÈÈÄÖÁË¡£
àÅ£¬ÎªÊ²Ã´ÒªMixinѽ£¿
Õâ¸ö£¬»ù±¾ÉÏÒѾ­ÊÇÎÒÕâƪÎÄÕÂÀïÒª½²µÄ¶«Î÷ÁË£¬ËùÒÔ£¬ÎÒ»áÓñ¾ÎĵĴ󲿷Öƪ·ùÀ´»Ø´ðÄãÕâ¸ö³¬ÓÐÉî¶ÈµÄÎÊÌâ¡£ÏÖÔÚ£¬¾Í¿ªÊ¼°É¡«
Сʱºò£¬ÎÒ¼Ò¿ª°Ù»õµê£¬µ±È»£¬Ò²¼æӪˮ¹ûÊ߲˰¡¡£
СʱºòµÄÊ£¬×ÜÊÇÌرðÓÐȤ£¬Ò²ÌرðµÄÓÐÒâÒ壬ËùÒÔ½ñÌìÎÒÃǾÍÒÔË®¹ûµê¿ªÊ¼°É¡«
¼ÇµÃ£¬ÒÔÇ°ºÜ¶àÈËÂòË®¹ûµÄʱºò£¬¶¼»áÎÊÎÒÂèÒ»¸öÎÊÌ⣬¾ÍÊǼ۸ñÁËÀ²¡«µ«»¹ÓÐÁ½¸öÎÊÌâÒ²¾­³£Îʵ½Å¶£¬¾ÍÊÇËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈË£¿
àÅ£¬ÄêÇàÈË´ó¶à¶¼²»¶®ÕâЩÀñ½Ú¡£ËÍË®¹ûÒ²ÊǺܽ²Õ×Í·µÄ£¬±ÈÈçÀæºÍÏ㽶һ°ã²»ÓÃÀ´ËÍÈË£¬ÒòΪËüÃÇÒâζ×ÅÀë±ðºÍ½¹ÔêŶ£»¶øÆ»¹ûºÍ½Û×ӾͺÜÊÜ»¶Ó­£¬ÒòΪËüÃÇÒâζ×Åƽ°²ºÍ¼ªÀûŶ¡«
*ÒÔ´ËΪ¿ªÊ¼*
ÄÇ£¬Õâ¸úPythonÓÐʲô¹ØϵÂð£¿
µ±È»ÓÐÀ²£¬²»È»ÎÒ³¶ÄÇô¶àƤ¸ÉÂïßÖ£¿ÏÖÔÚ£¬¹ú²úÁèÁèÆá½Óµ½Ò»¸öÈÎÎñ£¬ÒªÇóËûΪһ¸öË®¹ûÁ¬Ëøµê¿ª·¢Ò»Ì×Èí¼þ£»ÏÔÈ»Õâ¸ö²»¹ØÐĹú¼ÆÃñÉúÕâЩ¼¦Ã«ËâƤµÄСʵÄÎä·òÊǸ㲻¶¨ÕâÏî¼è¾ÞÈÎÎñµÄÁË£¬Ëû¾ÍÕÒµ½ÁËÄã¡£
ͨ¹ýµ÷ÑУ¬¿Í»§·¢ÏÖÁ½¼þÊÂʵ£ºÒ»ÊÇÏÖÔÚµÄÄêÇàÈË»¹ÊDz»¶®ËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈËÕâÁ½¸öÎÊÌ⣻¶þÊÇË®¹ûÁ¬ËøµêµÄÓªÒµÔ±100£¥¶¼ÊÇÄêÇàÈË£¬ËûÃÇÖд󲿷ÖÈËÒ²²»¶®¡£
ËùÒÔ£¬¿Í»§ÒªÇóÔÚÈí¼þÖбØÐëÌṩһ¸öÕâÑùµÄ¹¦ÄÜ£­£­¿ÉÒÔ²éѯһÖÖË®¹ûÊÇ·ñÊÊÒËËÍÈË¡£
×î³õ£¬Äã¿ÉÄÜÕâÑùÉè¼Æ£º
class Fruit(object):
 pass
°ÑfruitÀà×÷ΪһÇÐË®¹ûµÄ»ùÀ࣬àÅ£¬ÕâÏ൱Ã÷ÖÇ¡£´úÂëÖÐÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬Èç¼Û¸ñ¡¢²úµØµÈ¡£
ÏÖÔÚÄã´òËãʵÏÖ×îÊܹ˿ͻ¶Ó­µÄÆ»¹û£º
class Apple(Fruit):
 def is_gift_fruit(self):
  return True
ͬÑùµÄ£¬ÎÒÓÖÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬²¢ÇÒ´òËãÔÚ½ÓÏÂÀ´µÄÐÐÎÄÖв»ÔÙÌáÐÑÕâÒ»µã¡£
AppleÊÇÒ»ÖÖFruit¡£ËùÒÔÉÏÃæµÄʵÏÖͦ·ûºÏOOµÄÔ­Ôò¡£
½ÓÏÂÀ´ÈÃÎÒÃÇʵÏÖÀæ×Ó°É£º
class Pear(Fruit):
 def is_gift_fruit(self):
  return False
½â¾öÎÊÌâÁË¡£Èç¹ûË®¹ûÁ¬ËøµêÖ»ÂôÆ»¹ûºÍÀæ×ÓÁ½ÖÖË®¹ûµÄ»°¡£
¿Éϧ£¬ÐèÇóºÜ¶à£¬Ä㻹ҪʵÏÖ½Û×ÓºÍÏ㽶ÄØ¡£ÄãдÏÂÁËÕ⼸ÐдúÂ룺
class Orange(Fruit):
 def is_gift_fruit(self):
  return True
class Banana(Fruit):
 def is_gift_fruit(self):
  return False
ºÃ³ô°¡£¬´úÂëµÄ»µÎ¶µÀ£¡
ÀàAppleºÍÀàOrange³ýÁËÀàÃû²»Í¬£¬¼¸ºõÊÇÍêÈ«Öظ´µÄ´úÂ룻ÀàPearºÍÀàBananaÒ²ÊÇÒ»Ñù¡£
¸ü½øÒ»²ãµÄ˵£¬ÕâËĸöÀ඼²î²»¶à°¡£¬ËùÒÔÎÒÃÇÓбØÒªÖع¹Ò»ÏÂÒÑÓдúÂ룬¸ÄÉÆËüÃǵÄÉè¼Æ¡£
¸ÄÉÆÒÑÓдúÂë
ÔĶÁ´úÂ룬Äã¿ÉÒÔ·¢ÏÖË®¹ûÖ»·ÖÁ½ÀࣺһÀàÊÇ¿ÉÒÔ×÷ΪÀñÆ·µÄ£¬Ò»ÀàÊDz»¿ÉÒԵġ£ËùÒÔÏ£Íû¿ÉÒÔÕâÑùÉè¼Æ£º
  Fruit
  / \
 GiftFruit NotGiftFruit
 / \ / \
Apple    Orange Pear Banana
àÅ£¬¼ÓÁËÁ½¸öÖмäÀ࣬¿´ÆðÀ´²»´í£º
class GiftFruit(Fruit):
 def is_gift_fruit(self):
  return True
class NotGiftFruit(Fruit):
 def is_gift_fruit(self):
  return False
class Apple(GiftFruit):pass
class Orange(GiftFruit):pass
class Pear(NotGiftFruit):pass
class Banana(NotGiftFruit):pass
ºÃÀ²£¬¿´ÉÏÈ¥ºÜ²»´íŶ£¬´úÂ뾫¼òÁ˲»ÉÙ£¬ÈÎÎñÍê³É¡«
*еķ³ÄÕ*
½ÓÏÂÀ´ÎÒÃÇÀ´Íê³ÉÁíÒ»ÏÄÜ£ºÌṩˮ¹ûʳÓ÷½·¨×Éѯ¡£
²»ÒªÐ¦Õâ¸öÐèÇó£¬ÕâÊÇÕæʵµÄÊг¡ÐèÇó¡£±ÈÈçÏ൱²¿·ÖÒ»±²×ÓÉú»îÔÚ±±·½µÄÅóÓѾÍûÓгԹýÁúÑÛÀóÖ¦Ï㽶£»¶øÄÏ·½ËäȻˮ¹û·á¸»£¬µ«²»ÖªµÀɽÖñÁñÁ«µÈÑóË®¹ûµÄÒ²´óÓÐÈËÔÚ¡£ÎÒÃÇÕâ¸öË®¹ûÁ¬ËøµêÒµÎñ¼òµ¥£¬Ë®¹ûµÄʳÓ÷½·¨Ò²Ö»·ÖÁ½ÖÖ£ºÒ»ÖÖÊÇ°þƤµÄ£¬Èç½Û×ÓºÍÏ㽶£»ÁíÒ»ÖÖÊÇÏ÷ƤµÄ£¬ÈçÆ»¹ûºÍÀæ×Ó¡£ÈÃÎÒÃÇÐÞ¸ÄÔ­ÓеÄÉè¼Æ£º
   Fruit
   / \
  GiftFruit NotGiftFruit
  / \ /  \
 PareG...   HuskG... PareNot... HuskNot...
 /  / /  /
Apple     Orange  Pear  Banana
²»µÃÒÑ£¬ÎÒÃÇÌí¼ÓÁËËĸöÀࣺ
class PareGiftFruit(GiftFruit):
 def eat_method(self):
  return 'Pare'
class HustGiftFruit(GiftFruit):
 def eat_method(self):
  return 'Husk'
class PareNotGiftFruit(NotGiftFruit):
 def eat_method(self):
  return 'Pare'
class HuskNotGiftFruit(NotGiftFruit):
 def eat_method(self):
  return 'Husk'
ÔõôÕâËĸöÀàÕâôÏñ°¡£¿º¹¡£¡£¡£¡£
ÏÈÈÌÈÌ£¬°ÑAOPBËÄÖÖË®¹ûµÄʵÏָĸģº
class Apple(PareGiftFruit):pass
class Orange(HuskGiftFruit):pass
class Pear(PareNotGiftFruit):Pass
class Banana(HuskNotGiftFruit):pass
ÎÒÒѾ­ÈÌÎÞ¿ÉÈÌÁË¡£Õâ¸öÉè¼Æ²»½ö½öÓÖÒýÈëÁ˺ò»ÈÝÒ×Ïû³ýµÄÖظ´´úÂ룬¶øÇÒ»¹ÐÞ¸ÄÁËAOPBÕâËĸöÀàµÄʵÏÖ¡£ÕâÖÖÉè¼ÆµÄÀ©Õ¹ÐÔÒ²²»ºÃ£¬Èç¹ûÒÔºóÒªÌṩˮ¹ûµÄÆäËüÌص㣬±ÈÈçÊǽø¿ÚË®¹û»¹Êǹú²úË®¹û¡£Ìì°¡£¬Õ⻹Á˵㡼ÓÉÏÕâ¸öÌØÐÔ£¬ÎÒҪʵÏÖNativePareGiftFruit¡¢NativeHuskGiftFruitµÈÀ๲8¸ö£¨2µÄÈý´Î·½£©°¡¡£Ë®¹ûµÄÌØÕ÷¶àµÃºÜ£¬Ëæ±ãËãËã¿ÉÄܳ¬¹ý16ÖÖ°¡£¬65536¸öÀࣿ½ÐÎÒÈ¥ËÀ°É¡«µ¥Êdz¤´ï16¸öµ¥´ÊµÄÀàÃûÎҾͱÀÀ£ÁË£¡
ÏÖÔÚ£¬ÄãÃǶ¼Ó¦¸ÃÒâʶµ½ÕâÖÖʵÏÖ·½·¨ÊµÔÚÊÇÒ»ÖÖö»öºµÄÉè¼ÆÁË¡£ÄÇ£¬ÎÒÃÇÓ¦¸ÃÔõôÑùÉè¼ÆÄØ£¿
*PythonicµÄ·½°¸*
¸ÃÊÇMixin³ö³¡µÄʱºòÁË£¡
ÏÈÀ´¿´¿´MixinµÄʵÏÖ°É£º
class Fruit(object):
 pass
class GiftMixin(object):
 def is_gift_fruit(self):
  return True
class NotGiftMixin(object):
 def is_gift_fruit(self):
  return False
class PareMixin(object):
 def eat_method(self):
  return 'Pare'
class HuskMixin(object):
 def eat_method(self):
  return 'Husk'
class Apple(GiftMixin, PareMixin, Fruit):pass
class Orange(GiftMixin, HuskMixin, Fruit):pass
class Pear(NotGiftMixin, PareMixin, Fruit):pass
class Banana(NotGiftMixin, HuskMixin, Fruit):pass
±àÂëÍê³É£¡Õâ¾ÍÊÇMixin£¬¾ÍÊÇÕâô¼òµ¥£¬ÒÔÖÂÎÒÎÞ·¨ÔÙ˵³öÈκÎÑÔÓÒòΪÎÒ¾õµÃÉÏÃæµÄ´úÂëÒѾ­ÍêÕûµØ±í´ïÁËÎÒÏëÒª±í´ïµÄ˼Ïë¡£
×¢Òâ, ÒòΪ Python ÀïÃæ¶àÖؼ̳ÐʱÈç¹û±»µ÷ÓõijÉÔ±º¯ÊýÖ»´æÔÚÓÚ¸¸ÀàÖУ¬Ôò°´ÀàÉùÃ÷µÄ¸¸Àà´Ó×óµ½ÓÒ²éÕÒµ÷ÓõÄ, ËùÒÔÖ÷Àà±»·ÅÔÚÓÒ±ß, MixIn
±»·ÅÔÚ×ó±ß£¬²ÅÄÜÕýÈ·µØµ÷Óõ½MixinµÄ³ÉÔ±º¯Êý¡£
MixinµÄºÃ´¦ÊÇ¿ÉÒÔΪÖ÷ÀࣨÈçFruit£©Ìí¼ÓÈÎÒâ¶àµÄMixinÀ´ÊµÏÖ¶à̬£¬±ÈÈç¸Õ²Å˵µÄË®¹ûÓнø¿ÚºÍ¹ú²úÁ½¸öÌØÕ÷£¬ÏÖÔÚÏ൱ÈÝÒ×ʵÏÖ£º
class NativeMixin(object):
 def Locality(self):
  return 'Native'
class ForeignMixin(object):
 def Locality(self):
  return 'Foreign'
class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #½ø¿Úºì¸»Ê¿
class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
¼òµ¥¶àÁË£¬Ö»¼ÓÁËÁ½¸öÀ࣬¶ÔAOPBµÄʵÏÖÒ²Ö»ÊÇÔö¼ÓÁËÒ»¸ö»ùÀࣨÔö¼Ó×ÜÊÇʤ¹ýÐ޸ģ©¡£
ÀûÓÃMixinÎÒÃÇ»¹¿ÉÒÔÔö¼ÓÎÞÊý×ÜÌØÕ÷£¬¶øÎÞÐè¶ÔÒÑÓдúÂë×÷Ì«´ó¸Ä¶¯¡£
ÁíÍ⣬ÎÒÃÇ»¹»ñµÃÁË¿ÉÖØÓÃÐÔ¡£±ÈÈçNativeMixinºÍForeignMixin¸úÖ÷ÀàHuman½áºÏ£¬¿ÉÒÔ×ö³ö¹úÈ˺ÍÀÏÍâÁ½¸öÀàŶ¡«Ò²ÐíË®¹ûÁ¬ËøµêÈí¼þÒÔºó»á¿¼ÂǼǼ¹ØÓÚ¿Í»§ÊÇ·ñÍâ¹úÈ˵ÄÐÅÏ¢ÄØ¡£
*³ý´ËÖ®Íâ*
Õâʱºò£¬Äã¿ÉÄÜ»á˵£ºË®¹ûÁ¬ËøµêÈí¼þÖ»ÊÇÄã¶Å׫µÄÒ»¸öÏîÄ¿£¬MixinÓÐʲôʵ¼ÊÓô¦Â𣿵±È»ÓÐÀ²£¡ÆäʵMixin²¢²»ÊÇʲô¸ß½×µÄPython¼¼ÇÉ£¬ÔçÓоͺܶ࿪ԴÏîĿʹÓÃÕâ¸ö¼¼ÇÉÁË£¬µäÐ͵ģ¬±ÈÈçPythonÏîÄ¿°¡£¡
ÔÚPython×Ô´øµÄSocketServer.pyÀï¾ÍÓ¦ÓÃÁËMixinÀ´ÊµÏÖ»ùÓÚ½ø³ÌºÍ»ùÓÚÏ̵߳ÄÁ½ÖÖTCP
/UDP·þÎñÄ£ÐÍ£¬ÔÚTkinterºÍPythonµÄÆäËüÄ£¿éÒ²¿ÉÒÔ¼ûµ½ËüµÄ×Ù¼££¬Èç¹ûÄãÁôÒâµÄ»°¡£
# SocketServer.py ÀïµÄMixin
class ForkingUDPServer(ForkingMixIn, UDPServer): pass
class ForkingTCPServer(ForkingMixIn, TCPServer): pass
class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
È·ÇÐÀ´Ëµ£¬ÎÒ¶ÔMixinÀ´ÊµÏÖµÄË®¹ûÁ¬ËøµêµÄʵÏÖÈÔÈ»Ï൱²»ÂúÒ⣬µ«Èç¹ûÎÒÃÇÏëÒª×ã¹»ÃæÏò¶ÔÏó£¬Ò²¾Í»ù±¾ÉÏÖ»ÄܽÓÊÜÈç´Ë½â¾ö·½°¸ÁË¡£Èç¹ûÓÐÒ»ÌìÄã²»ÄÜÈÌÊÜÿÔö¼ÓÒ»ÖÖÌØÕ÷Äã¾Í±ØÐë±àдN£¨N>=2£©¸öMixin£¬È»ºó¶¼±ØÐë¸øÒѾ­´æÔÚµÄAOPB´úÂëÔö¼ÓÒ»¸ö»ùÀࣨÏëÏ룬ˮ¹ûµêÂôµÄ¿É²»Ö¹ËÄÖÖË®¹û£¬Äã»á¸üÍ·´ó£©£¬ÄÇ£¬¾Í¿¼ÂÇ°ÑOOÅ×Æú°É£¡
*Ãùл*
ÔÚ±¾ÎijÉÎĹý³ÌÖУ¬ÉòáË(http://eishn.blog.163.com)¸øÎҺܴó°ïÖú£¬ÌØ´ËÃùл¡£
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/53382601/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 12:17

haur hekun06在gmail.com
星期一 六月 18 12:17:35 HKT 2007

˵ʲô¶«Î÷?ɾ³ý!!!!

ÔÚ07-6-18£¬lai yonghao <lanphaday在gmail.com> дµÀ£º
>
> Mixin ɨä°à
> ˵(http://blog.csdn.net/lanphaday)
>
> ÉùÃ÷£º±¾ÎÄÊʺϳõÖм¶Python³ÌÐòÔ±ÔĶÁ£¬ÁíÍâ±¾ÎÄ´ë´Ê¿ÉÄܻᵼÖÂÔĶÁÕß²»ÊÊ£¬¾´ÇëPG¡£
>
> *Òý×Ó*
> àÅ£¬ÎªÊ²Ã´ÒªÌ¸Mixin°¡£¿
>
> ÒòΪ³öÏÖÁËMixinÕâÑùÒ»¸ö¶«Î÷ѽ£¬¾ÍÏñC++ÉçÇøºÜ¶àÈË̸ÂÛtemplateÒ»Ñù°¡£¬PythonÉçÇøÒ²ºÜ¶à»á̸ÂÛMixinµÄ£¨ÒÔºó»áµÄ£¬ÎûÎû£©£¬ËùÒÔÎÒ¾ÍÀ´´Õ´ÕÈÈÄÖÁË¡£
> àÅ£¬ÎªÊ²Ã´ÒªMixinѽ£¿
> Õâ¸ö£¬»ù±¾ÉÏÒѾ­ÊÇÎÒÕâƪÎÄÕÂÀïÒª½²µÄ¶«Î÷ÁË£¬ËùÒÔ£¬ÎÒ»áÓñ¾ÎĵĴ󲿷Öƪ·ùÀ´»Ø´ðÄãÕâ¸ö³¬ÓÐÉî¶ÈµÄÎÊÌâ¡£ÏÖÔÚ£¬¾Í¿ªÊ¼°É¡«
> Сʱºò£¬ÎÒ¼Ò¿ª°Ù»õµê£¬µ±È»£¬Ò²¼æӪˮ¹ûÊ߲˰¡¡£
> СʱºòµÄÊ£¬×ÜÊÇÌرðÓÐȤ£¬Ò²ÌرðµÄÓÐÒâÒ壬ËùÒÔ½ñÌìÎÒÃǾÍÒÔË®¹ûµê¿ªÊ¼°É¡«
> ¼ÇµÃ£¬ÒÔÇ°ºÜ¶àÈËÂòË®¹ûµÄʱºò£¬¶¼»áÎÊÎÒÂèÒ»¸öÎÊÌ⣬¾ÍÊǼ۸ñÁËÀ²¡«µ«»¹ÓÐÁ½¸öÎÊÌâÒ²¾­³£Îʵ½Å¶£¬¾ÍÊÇËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈË£¿
> àÅ£¬ÄêÇàÈË´ó¶à¶¼²»¶®ÕâЩÀñ½Ú¡£ËÍË®¹ûÒ²ÊǺܽ²Õ×Í·µÄ£¬±ÈÈçÀæºÍÏ㽶һ°ã²»ÓÃÀ´ËÍÈË£¬ÒòΪËüÃÇÒâζ×ÅÀë±ðºÍ½¹ÔêŶ£»¶øÆ»¹ûºÍ½Û×ӾͺÜÊÜ»¶Ó­£¬ÒòΪËüÃÇÒâζ×Åƽ°²ºÍ¼ªÀûŶ¡«
>
> *ÒÔ´ËΪ¿ªÊ¼*
> ÄÇ£¬Õâ¸úPythonÓÐʲô¹ØϵÂð£¿
>
> µ±È»ÓÐÀ²£¬²»È»ÎÒ³¶ÄÇô¶àƤ¸ÉÂïßÖ£¿ÏÖÔÚ£¬¹ú²úÁèÁèÆá½Óµ½Ò»¸öÈÎÎñ£¬ÒªÇóËûΪһ¸öË®¹ûÁ¬Ëøµê¿ª·¢Ò»Ì×Èí¼þ£»ÏÔÈ»Õâ¸ö²»¹ØÐĹú¼ÆÃñÉúÕâЩ¼¦Ã«ËâƤµÄСʵÄÎä·òÊǸ㲻¶¨ÕâÏî¼è¾ÞÈÎÎñµÄÁË£¬Ëû¾ÍÕÒµ½ÁËÄã¡£
> ͨ¹ýµ÷ÑУ¬¿Í»§·¢ÏÖÁ½¼þÊÂʵ£ºÒ»ÊÇÏÖÔÚµÄÄêÇàÈË»¹ÊDz»¶®ËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈËÕâÁ½¸öÎÊÌ⣻¶þÊÇË®¹ûÁ¬ËøµêµÄÓªÒµÔ±100£¥¶¼ÊÇÄêÇàÈË£¬ËûÃÇÖд󲿷ÖÈËÒ²²»¶®¡£
>
> ËùÒÔ£¬¿Í»§ÒªÇóÔÚÈí¼þÖбØÐëÌṩһ¸öÕâÑùµÄ¹¦ÄÜ£­£­¿ÉÒÔ²éѯһÖÖË®¹ûÊÇ·ñÊÊÒËËÍÈË¡£
> ×î³õ£¬Äã¿ÉÄÜÕâÑùÉè¼Æ£º
> class Fruit(object):
>  pass
> °ÑfruitÀà×÷ΪһÇÐË®¹ûµÄ»ùÀ࣬àÅ£¬ÕâÏ൱Ã÷ÖÇ¡£´úÂëÖÐÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬Èç¼Û¸ñ¡¢²úµØµÈ¡£
> ÏÖÔÚÄã´òËãʵÏÖ×îÊܹ˿ͻ¶Ó­µÄÆ»¹û£º
> class Apple(Fruit):
>  def is_gift_fruit(self):
>   return True
> ͬÑùµÄ£¬ÎÒÓÖÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬²¢ÇÒ´òËãÔÚ½ÓÏÂÀ´µÄÐÐÎÄÖв»ÔÙÌáÐÑÕâÒ»µã¡£
> AppleÊÇÒ»ÖÖFruit¡£ËùÒÔÉÏÃæµÄʵÏÖͦ·ûºÏOOµÄÔ­Ôò¡£
> ½ÓÏÂÀ´ÈÃÎÒÃÇʵÏÖÀæ×Ó°É£º
> class Pear(Fruit):
>  def is_gift_fruit(self):
>   return False
> ½â¾öÎÊÌâÁË¡£Èç¹ûË®¹ûÁ¬ËøµêÖ»ÂôÆ»¹ûºÍÀæ×ÓÁ½ÖÖË®¹ûµÄ»°¡£
> ¿Éϧ£¬ÐèÇóºÜ¶à£¬Ä㻹ҪʵÏÖ½Û×ÓºÍÏ㽶ÄØ¡£ÄãдÏÂÁËÕ⼸ÐдúÂ룺
> class Orange(Fruit):
>  def is_gift_fruit(self):
>   return True
> class Banana(Fruit):
>  def is_gift_fruit(self):
>   return False
> ºÃ³ô°¡£¬´úÂëµÄ»µÎ¶µÀ£¡
> ÀàAppleºÍÀàOrange³ýÁËÀàÃû²»Í¬£¬¼¸ºõÊÇÍêÈ«Öظ´µÄ´úÂ룻ÀàPearºÍÀàBananaÒ²ÊÇÒ»Ñù¡£
> ¸ü½øÒ»²ãµÄ˵£¬ÕâËĸöÀ඼²î²»¶à°¡£¬ËùÒÔÎÒÃÇÓбØÒªÖع¹Ò»ÏÂÒÑÓдúÂ룬¸ÄÉÆËüÃǵÄÉè¼Æ¡£
> ¸ÄÉÆÒÑÓдúÂë
> ÔĶÁ´úÂ룬Äã¿ÉÒÔ·¢ÏÖË®¹ûÖ»·ÖÁ½ÀࣺһÀàÊÇ¿ÉÒÔ×÷ΪÀñÆ·µÄ£¬Ò»ÀàÊDz»¿ÉÒԵġ£ËùÒÔÏ£Íû¿ÉÒÔÕâÑùÉè¼Æ£º
>   Fruit
>   / \
>  GiftFruit NotGiftFruit
>  / \ / \
> Apple    Orange Pear Banana
> àÅ£¬¼ÓÁËÁ½¸öÖмäÀ࣬¿´ÆðÀ´²»´í£º
> class GiftFruit(Fruit):
>  def is_gift_fruit(self):
>   return True
> class NotGiftFruit(Fruit):
>  def is_gift_fruit(self):
>   return False
> class Apple(GiftFruit):pass
> class Orange(GiftFruit):pass
> class Pear(NotGiftFruit):pass
> class Banana(NotGiftFruit):pass
> ºÃÀ²£¬¿´ÉÏÈ¥ºÜ²»´íŶ£¬´úÂ뾫¼òÁ˲»ÉÙ£¬ÈÎÎñÍê³É¡«
> *еķ³ÄÕ*
> ½ÓÏÂÀ´ÎÒÃÇÀ´Íê³ÉÁíÒ»ÏÄÜ£ºÌṩˮ¹ûʳÓ÷½·¨×Éѯ¡£
> ²»ÒªÐ¦Õâ¸öÐèÇó£¬ÕâÊÇÕæʵµÄÊг¡ÐèÇó¡£±ÈÈçÏ൱²¿·ÖÒ»±²×ÓÉú»îÔÚ±±·½µÄÅóÓѾÍûÓгԹýÁúÑÛÀóÖ¦Ï㽶£»¶øÄÏ·½ËäȻˮ¹û·á¸»£¬µ«²»ÖªµÀɽÖñÁñÁ«µÈÑóË®¹ûµÄÒ²´óÓÐÈËÔÚ¡£ÎÒÃÇÕâ¸öË®¹ûÁ¬ËøµêÒµÎñ¼òµ¥£¬Ë®¹ûµÄʳÓ÷½·¨Ò²Ö»·ÖÁ½ÖÖ£ºÒ»ÖÖÊÇ°þƤµÄ£¬Èç½Û×ÓºÍÏ㽶£»ÁíÒ»ÖÖÊÇÏ÷ƤµÄ£¬ÈçÆ»¹ûºÍÀæ×Ó¡£ÈÃÎÒÃÇÐÞ¸ÄÔ­ÓеÄÉè¼Æ£º
>
>    Fruit
>    / \
>   GiftFruit NotGiftFruit
>   / \ /  \
>  PareG...   HuskG... PareNot... HuskNot...
>  /  / /  /
> Apple     Orange  Pear  Banana
> ²»µÃÒÑ£¬ÎÒÃÇÌí¼ÓÁËËĸöÀࣺ
> class PareGiftFruit(GiftFruit):
>  def eat_method(self):
>   return 'Pare'
> class HustGiftFruit(GiftFruit):
>  def eat_method(self):
>   return 'Husk'
> class PareNotGiftFruit(NotGiftFruit):
>  def eat_method(self):
>   return 'Pare'
> class HuskNotGiftFruit(NotGiftFruit):
>  def eat_method(self):
>   return 'Husk'
> ÔõôÕâËĸöÀàÕâôÏñ°¡£¿º¹¡£¡£¡£¡£
> ÏÈÈÌÈÌ£¬°ÑAOPBËÄÖÖË®¹ûµÄʵÏָĸģº
> class Apple(PareGiftFruit):pass
> class Orange(HuskGiftFruit):pass
> class Pear(PareNotGiftFruit):Pass
> class Banana(HuskNotGiftFruit):pass
> ÎÒÒѾ­ÈÌÎÞ¿ÉÈÌÁË¡£Õâ¸öÉè¼Æ²»½ö½öÓÖÒýÈëÁ˺ò»ÈÝÒ×Ïû³ýµÄÖظ´´úÂ룬¶øÇÒ»¹ÐÞ¸ÄÁËAOPBÕâËĸöÀàµÄʵÏÖ¡£ÕâÖÖÉè¼ÆµÄÀ©Õ¹ÐÔÒ²²»ºÃ£¬Èç¹ûÒÔºóÒªÌṩˮ¹ûµÄÆäËüÌص㣬±ÈÈçÊǽø¿ÚË®¹û»¹Êǹú²úË®¹û¡£Ìì°¡£¬Õ⻹Á˵㡼ÓÉÏÕâ¸öÌØÐÔ£¬ÎÒҪʵÏÖNativePareGiftFruit¡¢NativeHuskGiftFruitµÈÀ๲8¸ö£¨2µÄÈý´Î·½£©°¡¡£Ë®¹ûµÄÌØÕ÷¶àµÃºÜ£¬Ëæ±ãËãËã¿ÉÄܳ¬¹ý16ÖÖ°¡£¬65536¸öÀࣿ½ÐÎÒÈ¥ËÀ°É¡«µ¥Êdz¤´ï16¸öµ¥´ÊµÄÀàÃûÎҾͱÀÀ£ÁË£¡
>
> ÏÖÔÚ£¬ÄãÃǶ¼Ó¦¸ÃÒâʶµ½ÕâÖÖʵÏÖ·½·¨ÊµÔÚÊÇÒ»ÖÖö»öºµÄÉè¼ÆÁË¡£ÄÇ£¬ÎÒÃÇÓ¦¸ÃÔõôÑùÉè¼ÆÄØ£¿
> *PythonicµÄ·½°¸*
> ¸ÃÊÇMixin³ö³¡µÄʱºòÁË£¡
> ÏÈÀ´¿´¿´MixinµÄʵÏÖ°É£º
> class Fruit(object):
>  pass
> class GiftMixin(object):
>  def is_gift_fruit(self):
>   return True
> class NotGiftMixin(object):
>  def is_gift_fruit(self):
>   return False
> class PareMixin(object):
>  def eat_method(self):
>   return 'Pare'
> class HuskMixin(object):
>  def eat_method(self):
>   return 'Husk'
> class Apple(GiftMixin, PareMixin, Fruit):pass
> class Orange(GiftMixin, HuskMixin, Fruit):pass
> class Pear(NotGiftMixin, PareMixin, Fruit):pass
> class Banana(NotGiftMixin, HuskMixin, Fruit):pass
> ±àÂëÍê³É£¡Õâ¾ÍÊÇMixin£¬¾ÍÊÇÕâô¼òµ¥£¬ÒÔÖÂÎÒÎÞ·¨ÔÙ˵³öÈκÎÑÔÓÒòΪÎÒ¾õµÃÉÏÃæµÄ´úÂëÒѾ­ÍêÕûµØ±í´ïÁËÎÒÏëÒª±í´ïµÄ˼Ïë¡£
> ×¢Òâ, ÒòΪ Python ÀïÃæ¶àÖؼ̳ÐʱÈç¹û±»µ÷ÓõijÉÔ±º¯ÊýÖ»´æÔÚÓÚ¸¸ÀàÖУ¬Ôò°´ÀàÉùÃ÷µÄ¸¸Àà´Ó×óµ½ÓÒ²éÕÒµ÷ÓõÄ, ËùÒÔÖ÷Àà±»·ÅÔÚÓÒ±ß, MixIn
> ±»·ÅÔÚ×ó±ß£¬²ÅÄÜÕýÈ·µØµ÷Óõ½MixinµÄ³ÉÔ±º¯Êý¡£
> MixinµÄºÃ´¦ÊÇ¿ÉÒÔΪÖ÷ÀࣨÈçFruit£©Ìí¼ÓÈÎÒâ¶àµÄMixinÀ´ÊµÏÖ¶à̬£¬±ÈÈç¸Õ²Å˵µÄË®¹ûÓнø¿ÚºÍ¹ú²úÁ½¸öÌØÕ÷£¬ÏÖÔÚÏ൱ÈÝÒ×ʵÏÖ£º
> class NativeMixin(object):
>  def Locality(self):
>   return 'Native'
> class ForeignMixin(object):
>  def Locality(self):
>   return 'Foreign'
> class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #½ø¿Úºì¸»Ê¿
> class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
> class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
> class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
> ¼òµ¥¶àÁË£¬Ö»¼ÓÁËÁ½¸öÀ࣬¶ÔAOPBµÄʵÏÖÒ²Ö»ÊÇÔö¼ÓÁËÒ»¸ö»ùÀࣨÔö¼Ó×ÜÊÇʤ¹ýÐ޸ģ©¡£
> ÀûÓÃMixinÎÒÃÇ»¹¿ÉÒÔÔö¼ÓÎÞÊý×ÜÌØÕ÷£¬¶øÎÞÐè¶ÔÒÑÓдúÂë×÷Ì«´ó¸Ä¶¯¡£
>
> ÁíÍ⣬ÎÒÃÇ»¹»ñµÃÁË¿ÉÖØÓÃÐÔ¡£±ÈÈçNativeMixinºÍForeignMixin¸úÖ÷ÀàHuman½áºÏ£¬¿ÉÒÔ×ö³ö¹úÈ˺ÍÀÏÍâÁ½¸öÀàŶ¡«Ò²ÐíË®¹ûÁ¬ËøµêÈí¼þÒÔºó»á¿¼ÂǼǼ¹ØÓÚ¿Í»§ÊÇ·ñÍâ¹úÈ˵ÄÐÅÏ¢ÄØ¡£
> *³ý´ËÖ®Íâ*
> Õâʱºò£¬Äã¿ÉÄÜ»á˵£ºË®¹ûÁ¬ËøµêÈí¼þÖ»ÊÇÄã¶Å׫µÄÒ»¸öÏîÄ¿£¬MixinÓÐʲôʵ¼ÊÓô¦Â𣿵±È»ÓÐÀ²£¡ÆäʵMixin²¢²»ÊÇʲô¸ß½×µÄPython¼¼ÇÉ£¬ÔçÓоͺܶ࿪ԴÏîĿʹÓÃÕâ¸ö¼¼ÇÉÁË£¬µäÐ͵ģ¬±ÈÈçPythonÏîÄ¿°¡£¡
> ÔÚPython×Ô´øµÄSocketServer.pyÀï¾ÍÓ¦ÓÃÁËMixinÀ´ÊµÏÖ»ùÓÚ½ø³ÌºÍ»ùÓÚÏ̵߳ÄÁ½ÖÖTCP
> /UDP·þÎñÄ£ÐÍ£¬ÔÚTkinterºÍPythonµÄÆäËüÄ£¿éÒ²¿ÉÒÔ¼ûµ½ËüµÄ×Ù¼££¬Èç¹ûÄãÁôÒâµÄ»°¡£
> # SocketServer.py ÀïµÄMixin
> class ForkingUDPServer(ForkingMixIn, UDPServer): pass
> class ForkingTCPServer(ForkingMixIn, TCPServer): pass
> class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
> class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
> È·ÇÐÀ´Ëµ£¬ÎÒ¶ÔMixinÀ´ÊµÏÖµÄË®¹ûÁ¬ËøµêµÄʵÏÖÈÔÈ»Ï൱²»ÂúÒ⣬µ«Èç¹ûÎÒÃÇÏëÒª×ã¹»ÃæÏò¶ÔÏó£¬Ò²¾Í»ù±¾ÉÏÖ»ÄܽÓÊÜÈç´Ë½â¾ö·½°¸ÁË¡£Èç¹ûÓÐÒ»ÌìÄã²»ÄÜÈÌÊÜÿÔö¼ÓÒ»ÖÖÌØÕ÷Äã¾Í±ØÐë±àдN£¨N>=2£©¸öMixin£¬È»ºó¶¼±ØÐë¸øÒѾ­´æÔÚµÄAOPB´úÂëÔö¼ÓÒ»¸ö»ùÀࣨÏëÏ룬ˮ¹ûµêÂôµÄ¿É²»Ö¹ËÄÖÖË®¹û£¬Äã»á¸üÍ·´ó£©£¬ÄÇ£¬¾Í¿¼ÂÇ°ÑOOÅ×Æú°É£¡
>
> *Ãùл*
> ÔÚ±¾ÎijÉÎĹý³ÌÖУ¬ÉòáË(http://eishn.blog.163.com)¸øÎҺܴó°ïÖú£¬ÌØ´ËÃùл¡£
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/a2bd4016/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 13:11

东子/hydon hydonlee在gmail.com
星期一 六月 18 13:11:44 HKT 2007

不错啊...行文相当流畅. 支持.(多根继承? 其实表达的是接口的概念...)

在07-6-18,haur <hekun06 at gmail.com> 写道:
>
> 说什么东西?删除!!!!
>
> 在07-6-18,lai yonghao <lanphaday at gmail.com> 写道:
> >
> > Mixin 扫盲班
> > 赖勇浩(http://blog.csdn.net/lanphaday)
> >
> > 声明:本文适合初中级Python程序员阅读,另外本文措词可能会导致阅读者不适,敬请PG。
> >
> > *引子*
> > 嗯,为什么要谈Mixin啊?
> >
> > 因为出现了Mixin这样一个东西呀,就像C++社区很多人谈论template一样啊,Python社区也很多会谈论Mixin的(以后会的,嘻嘻),所以我就来凑凑热闹了。
> > 嗯,为什么要Mixin呀?
> > 这个,基本上已经是我这篇文章里要讲的东西了,所以,我会用本文的大部分篇幅来回答你这个超有深度的问题。现在,就开始吧~
> > 小时候,我家开百货店,当然,也兼营水果蔬菜啊。
> > 小时候的事,总是特别有趣,也特别的有意义,所以今天我们就以水果店开始吧~
> > 记得,以前很多人买水果的时候,都会问我妈一个问题,就是价格了啦~但还有两个问题也经常问到哦,就是送人应该买什么水果和什么水果可以用来送人?
> > 嗯,年青人大多都不懂这些礼节。送水果也是很讲兆头的,比如梨和香蕉一般不用来送人,因为它们意味着离别和焦躁哦;而苹果和桔子就很受欢迎,因为它们意味着平安和吉利哦~
> >
> > *以此为开始*
> > 那,这跟Python有什么关系吗?
> >
> > 当然有啦,不然我扯那么多皮干嘛咧?现在,国产凌凌漆接到一个任务,要求他为一个水果连锁店开发一套软件;显然这个不关心国计民生这些鸡毛蒜皮的小事的武夫是搞不定这项艰巨任务的了,他就找到了你。
> > 通过调研,客户发现两件事实:一是现在的年青人还是不懂送人应该买什么水果和什么水果可以用来送人这两个问题;二是水果连锁店的营业员100%都是年青人,他们中大部分人也不懂。
> >
> > 所以,客户要求在软件中必须提供一个这样的功能--可以查询一种水果是否适宜送人。
> > 最初,你可能这样设计:
> > class Fruit(object):
> >  pass
> > 把fruit类作为一切水果的基类,嗯,这相当明智。代码中去除了一些无需关注的代码,如价格、产地等。
> > 现在你打算实现最受顾客欢迎的苹果:
> > class Apple(Fruit):
> >  def is_gift_fruit(self):
> >   return True
> > 同样的,我又去除了一些无需关注的代码,并且打算在接下来的行文中不再提醒这一点。
> > Apple是一种Fruit。所以上面的实现挺符合OO的原则。
> > 接下来让我们实现梨子吧:
> > class Pear(Fruit):
> >  def is_gift_fruit(self):
> >   return False
> > 解决问题了。如果水果连锁店只卖苹果和梨子两种水果的话。
> > 可惜,需求很多,你还要实现桔子和香蕉呢。你写下了这几行代码:
> > class Orange(Fruit):
> >  def is_gift_fruit(self):
> >   return True
> > class Banana(Fruit):
> >  def is_gift_fruit(self):
> >   return False
> > 好臭啊,代码的坏味道!
> > 类Apple和类Orange除了类名不同,几乎是完全重复的代码;类Pear和类Banana也是一样。
> > 更进一层的说,这四个类都差不多啊,所以我们有必要重构一下已有代码,改善它们的设计。
> > 改善已有代码
> > 阅读代码,你可以发现水果只分两类:一类是可以作为礼品的,一类是不可以的。所以希望可以这样设计:
> >   Fruit
> >   / \
> >  GiftFruit NotGiftFruit
> >  / \ / \
> > Apple    Orange Pear Banana
> > 嗯,加了两个中间类,看起来不错:
> > class GiftFruit(Fruit):
> >  def is_gift_fruit(self):
> >   return True
> > class NotGiftFruit(Fruit):
> >  def is_gift_fruit(self):
> >   return False
> > class Apple(GiftFruit):pass
> > class Orange(GiftFruit):pass
> > class Pear(NotGiftFruit):pass
> > class Banana(NotGiftFruit):pass
> > 好啦,看上去很不错哦,代码精简了不少,任务完成~
> > *新的烦恼*
> > 接下来我们来完成另一项功能:提供水果食用方法咨询。
> > 不要笑这个需求,这是真实的市场需求。比如相当部分一辈子生活在北方的朋友就没有吃过龙眼荔枝香蕉;而南方虽然水果丰富,但不知道山竹榴莲等洋水果的也大有人在。我们这个水果连锁店业务简单,水果的食用方法也只分两种:一种是剥皮的,如桔子和香蕉;另一种是削皮的,如苹果和梨子。让我们修改原有的设计:
> >
> >    Fruit
> >    / \
> >   GiftFruit NotGiftFruit
> >   / \ /  \
> >  PareG...   HuskG... PareNot... HuskNot...
> >  /  / /  /
> > Apple     Orange  Pear  Banana
> > 不得已,我们添加了四个类:
> > class PareGiftFruit(GiftFruit):
> >  def eat_method(self):
> >   return 'Pare'
> > class HustGiftFruit(GiftFruit):
> >  def eat_method(self):
> >   return 'Husk'
> > class PareNotGiftFruit(NotGiftFruit):
> >  def eat_method(self):
> >   return 'Pare'
> > class HuskNotGiftFruit(NotGiftFruit):
> >  def eat_method(self):
> >   return 'Husk'
> > 怎么这四个类这么像啊?汗。。。。
> > 先忍忍,把AOPB四种水果的实现改改:
> > class Apple(PareGiftFruit):pass
> > class Orange(HuskGiftFruit):pass
> > class Pear(PareNotGiftFruit):Pass
> > class Banana(HuskNotGiftFruit):pass
> > 我已经忍无可忍了。这个设计不仅仅又引入了好不容易消除的重复代码,而且还修改了AOPB这四个类的实现。这种设计的扩展性也不好,如果以后要提供水果的其它特点,比如是进口水果还是国产水果。天啊,这还了得!加上这个特性,我要实现NativePareGiftFruit、NativeHuskGiftFruit等类共8个(2的三次方)啊。水果的特征多得很,随便算算可能超过16种啊,65536个类?叫我去死吧~单是长达16个单词的类名我就崩溃了!
> >
> > 现在,你们都应该意识到这种实现方法实在是一种龌龊的设计了。那,我们应该怎么样设计呢?
> > *Pythonic的方案*
> > 该是Mixin出场的时候了!
> > 先来看看Mixin的实现吧:
> > class Fruit(object):
> >  pass
> > class GiftMixin(object):
> >  def is_gift_fruit(self):
> >   return True
> > class NotGiftMixin(object):
> >  def is_gift_fruit(self):
> >   return False
> > class PareMixin(object):
> >  def eat_method(self):
> >   return 'Pare'
> > class HuskMixin(object):
> >  def eat_method(self):
> >   return 'Husk'
> > class Apple(GiftMixin, PareMixin, Fruit):pass
> > class Orange(GiftMixin, HuskMixin, Fruit):pass
> > class Pear(NotGiftMixin, PareMixin, Fruit):pass
> > class Banana(NotGiftMixin, HuskMixin, Fruit):pass
> > 编码完成!这就是Mixin,就是这么简单,以致我无法再说出任何言语,因为我觉得上面的代码已经完整地表达了我想要表达的思想。
> > 注意, 因为 Python 里面多重继承时如果被调用的成员函数只存在于父类中,则按类声明的父类从左到右查找调用的, 所以主类被放在右边,
> > MixIn 被放在左边,才能正确地调用到Mixin的成员函数。
> > Mixin的好处是可以为主类(如Fruit)添加任意多的Mixin来实现多态,比如刚才说的水果有进口和国产两个特征,现在相当容易实现:
> > class NativeMixin(object):
> >  def Locality(self):
> >   return 'Native'
> > class ForeignMixin(object):
> >  def Locality(self):
> >   return 'Foreign'
> > class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #进口红富士
> > class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
> > class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
> > class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
> > 简单多了,只加了两个类,对AOPB的实现也只是增加了一个基类(增加总是胜过修改)。
> > 利用Mixin我们还可以增加无数总特征,而无需对已有代码作太大改动。
> >
> > 另外,我们还获得了可重用性。比如NativeMixin和ForeignMixin跟主类Human结合,可以做出国人和老外两个类哦~也许水果连锁店软件以后会考虑记录关于客户是否外国人的信息呢。
> > *除此之外*
> > 这时候,你可能会说:水果连锁店软件只是你杜撰的一个项目,Mixin有什么实际用处吗?当然有啦!其实Mixin并不是什么高阶的Python技巧,早有就很多开源项目使用这个技巧了,典型的,比如Python项目啊!
> > 在Python自带的SocketServer.py里就应用了Mixin来实现基于进程和基于线程的两种TCP
> > /UDP服务模型,在Tkinter和Python的其它模块也可以见到它的踪迹,如果你留意的话。
> > # SocketServer.py 里的Mixin
> > class ForkingUDPServer(ForkingMixIn, UDPServer): pass
> > class ForkingTCPServer(ForkingMixIn, TCPServer): pass
> > class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
> > class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
> > 确切来说,我对Mixin来实现的水果连锁店的实现仍然相当不满意,但如果我们想要足够面向对象,也就基本上只能接受如此解决方案了。如果有一天你不能忍受每增加一种特征你就必须编写N(N>=2)个Mixin,然后都必须给已经存在的AOPB代码增加一个基类(想想,水果店卖的可不止四种水果,你会更头大),那,就考虑把OO抛弃吧!
> >
> > *鸣谢*
> > 在本文成文过程中,沈崴(http://eishn.blog.163.com)给我很大帮助,特此鸣谢。
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese at lists.python.cn
> > Subscribe: send subscribe to python-chinese-request at lists.python.cn
> > Unsubscribe: send unsubscribe to
> > python-chinese-request at lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
努力做好每一件事
TRY TO DO MY BEST
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/40aeee1b/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 13:40

haur hekun06在gmail.com
星期一 六月 18 13:40:38 HKT 2007

ÄѵÀÊÇ,¸ßÊÖ¹ýÕÐ ....

ÔÚ07-6-18£¬¶«×Ó/hydon <hydonlee在gmail.com> дµÀ£º
>
> ²»´í°¡...ÐÐÎÄÏ൱Á÷³©. Ö§³Ö.(¶à¸ù¼Ì³Ð? Æäʵ±í´ïµÄÊǽӿڵĸÅÄî...)
>
> ÔÚ07-6-18£¬haur <hekun06在gmail.com> дµÀ£º
> >
> > ˵ʲô¶«Î÷?ɾ³ý!!!!
> >
> > ÔÚ07-6-18£¬lai yonghao <lanphaday在gmail.com > дµÀ£º
> > >
> > > Mixin ɨä°à
> > > ˵(http://blog.csdn.net/lanphaday)
> > >
> > > ÉùÃ÷£º±¾ÎÄÊʺϳõÖм¶Python³ÌÐòÔ±ÔĶÁ£¬ÁíÍâ±¾ÎÄ´ë´Ê¿ÉÄܻᵼÖÂÔĶÁÕß²»ÊÊ£¬¾´ÇëPG¡£
> > >
> > > *Òý×Ó*
> > > àÅ£¬ÎªÊ²Ã´ÒªÌ¸Mixin°¡£¿
> > >
> > > ÒòΪ³öÏÖÁËMixinÕâÑùÒ»¸ö¶«Î÷ѽ£¬¾ÍÏñC++ÉçÇøºÜ¶àÈË̸ÂÛtemplateÒ»Ñù°¡£¬PythonÉçÇøÒ²ºÜ¶à»á̸ÂÛMixinµÄ£¨ÒÔºó»áµÄ£¬ÎûÎû£©£¬ËùÒÔÎÒ¾ÍÀ´´Õ´ÕÈÈÄÖÁË¡£
> > > àÅ£¬ÎªÊ²Ã´ÒªMixinѽ£¿
> > > Õâ¸ö£¬»ù±¾ÉÏÒѾ­ÊÇÎÒÕâƪÎÄÕÂÀïÒª½²µÄ¶«Î÷ÁË£¬ËùÒÔ£¬ÎÒ»áÓñ¾ÎĵĴ󲿷Öƪ·ùÀ´»Ø´ðÄãÕâ¸ö³¬ÓÐÉî¶ÈµÄÎÊÌâ¡£ÏÖÔÚ£¬¾Í¿ªÊ¼°É¡«
> > > Сʱºò£¬ÎÒ¼Ò¿ª°Ù»õµê£¬µ±È»£¬Ò²¼æӪˮ¹ûÊ߲˰¡¡£
> > > СʱºòµÄÊ£¬×ÜÊÇÌرðÓÐȤ£¬Ò²ÌرðµÄÓÐÒâÒ壬ËùÒÔ½ñÌìÎÒÃǾÍÒÔË®¹ûµê¿ªÊ¼°É¡«
> > > ¼ÇµÃ£¬ÒÔÇ°ºÜ¶àÈËÂòË®¹ûµÄʱºò£¬¶¼»áÎÊÎÒÂèÒ»¸öÎÊÌ⣬¾ÍÊǼ۸ñÁËÀ²¡«µ«»¹ÓÐÁ½¸öÎÊÌâÒ²¾­³£Îʵ½Å¶£¬¾ÍÊÇËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈË£¿
> > > àÅ£¬ÄêÇàÈË´ó¶à¶¼²»¶®ÕâЩÀñ½Ú¡£ËÍË®¹ûÒ²ÊǺܽ²Õ×Í·µÄ£¬±ÈÈçÀæºÍÏ㽶һ°ã²»ÓÃÀ´ËÍÈË£¬ÒòΪËüÃÇÒâζ×ÅÀë±ðºÍ½¹ÔêŶ£»¶øÆ»¹ûºÍ½Û×ӾͺÜÊÜ»¶Ó­£¬ÒòΪËüÃÇÒâζ×Åƽ°²ºÍ¼ªÀûŶ¡«
> > >
> > > *ÒÔ´ËΪ¿ªÊ¼*
> > > ÄÇ£¬Õâ¸úPythonÓÐʲô¹ØϵÂð£¿
> > >
> > > µ±È»ÓÐÀ²£¬²»È»ÎÒ³¶ÄÇô¶àƤ¸ÉÂïßÖ£¿ÏÖÔÚ£¬¹ú²úÁèÁèÆá½Óµ½Ò»¸öÈÎÎñ£¬ÒªÇóËûΪһ¸öË®¹ûÁ¬Ëøµê¿ª·¢Ò»Ì×Èí¼þ£»ÏÔÈ»Õâ¸ö²»¹ØÐĹú¼ÆÃñÉúÕâЩ¼¦Ã«ËâƤµÄСʵÄÎä·òÊǸ㲻¶¨ÕâÏî¼è¾ÞÈÎÎñµÄÁË£¬Ëû¾ÍÕÒµ½ÁËÄã¡£
> > > ͨ¹ýµ÷ÑУ¬¿Í»§·¢ÏÖÁ½¼þÊÂʵ£ºÒ»ÊÇÏÖÔÚµÄÄêÇàÈË»¹ÊDz»¶®ËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈËÕâÁ½¸öÎÊÌ⣻¶þÊÇË®¹ûÁ¬ËøµêµÄÓªÒµÔ±100£¥¶¼ÊÇÄêÇàÈË£¬ËûÃÇÖд󲿷ÖÈËÒ²²»¶®¡£
> > >
> > > ËùÒÔ£¬¿Í»§ÒªÇóÔÚÈí¼þÖбØÐëÌṩһ¸öÕâÑùµÄ¹¦ÄÜ£­£­¿ÉÒÔ²éѯһÖÖË®¹ûÊÇ·ñÊÊÒËËÍÈË¡£
> > > ×î³õ£¬Äã¿ÉÄÜÕâÑùÉè¼Æ£º
> > > class Fruit(object):
> > >  pass
> > > °ÑfruitÀà×÷ΪһÇÐË®¹ûµÄ»ùÀ࣬àÅ£¬ÕâÏ൱Ã÷ÖÇ¡£´úÂëÖÐÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬Èç¼Û¸ñ¡¢²úµØµÈ¡£
> > > ÏÖÔÚÄã´òËãʵÏÖ×îÊܹ˿ͻ¶Ó­µÄÆ»¹û£º
> > > class Apple(Fruit):
> > >  def is_gift_fruit(self):
> > >   return True
> > > ͬÑùµÄ£¬ÎÒÓÖÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬²¢ÇÒ´òËãÔÚ½ÓÏÂÀ´µÄÐÐÎÄÖв»ÔÙÌáÐÑÕâÒ»µã¡£
> > > AppleÊÇÒ»ÖÖFruit¡£ËùÒÔÉÏÃæµÄʵÏÖͦ·ûºÏOOµÄÔ­Ôò¡£
> > > ½ÓÏÂÀ´ÈÃÎÒÃÇʵÏÖÀæ×Ó°É£º
> > > class Pear(Fruit):
> > >  def is_gift_fruit(self):
> > >   return False
> > > ½â¾öÎÊÌâÁË¡£Èç¹ûË®¹ûÁ¬ËøµêÖ»ÂôÆ»¹ûºÍÀæ×ÓÁ½ÖÖË®¹ûµÄ»°¡£
> > > ¿Éϧ£¬ÐèÇóºÜ¶à£¬Ä㻹ҪʵÏÖ½Û×ÓºÍÏ㽶ÄØ¡£ÄãдÏÂÁËÕ⼸ÐдúÂ룺
> > > class Orange(Fruit):
> > >  def is_gift_fruit(self):
> > >   return True
> > > class Banana(Fruit):
> > >  def is_gift_fruit(self):
> > >   return False
> > > ºÃ³ô°¡£¬´úÂëµÄ»µÎ¶µÀ£¡
> > > ÀàAppleºÍÀàOrange³ýÁËÀàÃû²»Í¬£¬¼¸ºõÊÇÍêÈ«Öظ´µÄ´úÂ룻ÀàPearºÍÀàBananaÒ²ÊÇÒ»Ñù¡£
> > > ¸ü½øÒ»²ãµÄ˵£¬ÕâËĸöÀ඼²î²»¶à°¡£¬ËùÒÔÎÒÃÇÓбØÒªÖع¹Ò»ÏÂÒÑÓдúÂ룬¸ÄÉÆËüÃǵÄÉè¼Æ¡£
> > > ¸ÄÉÆÒÑÓдúÂë
> > > ÔĶÁ´úÂ룬Äã¿ÉÒÔ·¢ÏÖË®¹ûÖ»·ÖÁ½ÀࣺһÀàÊÇ¿ÉÒÔ×÷ΪÀñÆ·µÄ£¬Ò»ÀàÊDz»¿ÉÒԵġ£ËùÒÔÏ£Íû¿ÉÒÔÕâÑùÉè¼Æ£º
> > >   Fruit
> > >   / \
> > >  GiftFruit NotGiftFruit
> > >  / \ / \
> > > Apple    Orange Pear Banana
> > > àÅ£¬¼ÓÁËÁ½¸öÖмäÀ࣬¿´ÆðÀ´²»´í£º
> > > class GiftFruit(Fruit):
> > >  def is_gift_fruit(self):
> > >   return True
> > > class NotGiftFruit(Fruit):
> > >  def is_gift_fruit(self):
> > >   return False
> > > class Apple(GiftFruit):pass
> > > class Orange(GiftFruit):pass
> > > class Pear(NotGiftFruit):pass
> > > class Banana(NotGiftFruit):pass
> > > ºÃÀ²£¬¿´ÉÏÈ¥ºÜ²»´íŶ£¬´úÂ뾫¼òÁ˲»ÉÙ£¬ÈÎÎñÍê³É¡«
> > > *еķ³ÄÕ*
> > > ½ÓÏÂÀ´ÎÒÃÇÀ´Íê³ÉÁíÒ»ÏÄÜ£ºÌṩˮ¹ûʳÓ÷½·¨×Éѯ¡£
> > > ²»ÒªÐ¦Õâ¸öÐèÇó£¬ÕâÊÇÕæʵµÄÊг¡ÐèÇó¡£±ÈÈçÏ൱²¿·ÖÒ»±²×ÓÉú»îÔÚ±±·½µÄÅóÓѾÍûÓгԹýÁúÑÛÀóÖ¦Ï㽶£»¶øÄÏ·½ËäȻˮ¹û·á¸»£¬µ«²»ÖªµÀɽÖñÁñÁ«µÈÑóË®¹ûµÄÒ²´óÓÐÈËÔÚ¡£ÎÒÃÇÕâ¸öË®¹ûÁ¬ËøµêÒµÎñ¼òµ¥£¬Ë®¹ûµÄʳÓ÷½·¨Ò²Ö»·ÖÁ½ÖÖ£ºÒ»ÖÖÊÇ°þƤµÄ£¬Èç½Û×ÓºÍÏ㽶£»ÁíÒ»ÖÖÊÇÏ÷ƤµÄ£¬ÈçÆ»¹ûºÍÀæ×Ó¡£ÈÃÎÒÃÇÐÞ¸ÄÔ­ÓеÄÉè¼Æ£º
> > >
> > >    Fruit
> > >    / \
> > >   GiftFruit NotGiftFruit
> > >   / \ /  \
> > >  PareG...   HuskG... PareNot... HuskNot...
> > >  /  / /  /
> > > Apple     Orange  Pear  Banana
> > > ²»µÃÒÑ£¬ÎÒÃÇÌí¼ÓÁËËĸöÀࣺ
> > > class PareGiftFruit(GiftFruit):
> > >  def eat_method(self):
> > >   return 'Pare'
> > > class HustGiftFruit(GiftFruit):
> > >  def eat_method(self):
> > >   return 'Husk'
> > > class PareNotGiftFruit(NotGiftFruit):
> > >  def eat_method(self):
> > >   return 'Pare'
> > > class HuskNotGiftFruit(NotGiftFruit):
> > >  def eat_method(self):
> > >   return 'Husk'
> > > ÔõôÕâËĸöÀàÕâôÏñ°¡£¿º¹¡£¡£¡£¡£
> > > ÏÈÈÌÈÌ£¬°ÑAOPBËÄÖÖË®¹ûµÄʵÏָĸģº
> > > class Apple(PareGiftFruit):pass
> > > class Orange(HuskGiftFruit):pass
> > > class Pear(PareNotGiftFruit):Pass
> > > class Banana(HuskNotGiftFruit):pass
> > > ÎÒÒѾ­ÈÌÎÞ¿ÉÈÌÁË¡£Õâ¸öÉè¼Æ²»½ö½öÓÖÒýÈëÁ˺ò»ÈÝÒ×Ïû³ýµÄÖظ´´úÂ룬¶øÇÒ»¹ÐÞ¸ÄÁËAOPBÕâËĸöÀàµÄʵÏÖ¡£ÕâÖÖÉè¼ÆµÄÀ©Õ¹ÐÔÒ²²»ºÃ£¬Èç¹ûÒÔºóÒªÌṩˮ¹ûµÄÆäËüÌص㣬±ÈÈçÊǽø¿ÚË®¹û»¹Êǹú²úË®¹û¡£Ìì°¡£¬Õ⻹Á˵㡼ÓÉÏÕâ¸öÌØÐÔ£¬ÎÒҪʵÏÖNativePareGiftFruit¡¢NativeHuskGiftFruitµÈÀ๲8¸ö£¨2µÄÈý´Î·½£©°¡¡£Ë®¹ûµÄÌØÕ÷¶àµÃºÜ£¬Ëæ±ãËãËã¿ÉÄܳ¬¹ý16ÖÖ°¡£¬65536¸öÀࣿ½ÐÎÒÈ¥ËÀ°É¡«µ¥Êdz¤´ï16¸öµ¥´ÊµÄÀàÃûÎҾͱÀÀ£ÁË£¡
> > >
> > > ÏÖÔÚ£¬ÄãÃǶ¼Ó¦¸ÃÒâʶµ½ÕâÖÖʵÏÖ·½·¨ÊµÔÚÊÇÒ»ÖÖö»öºµÄÉè¼ÆÁË¡£ÄÇ£¬ÎÒÃÇÓ¦¸ÃÔõôÑùÉè¼ÆÄØ£¿
> > > *PythonicµÄ·½°¸*
> > > ¸ÃÊÇMixin³ö³¡µÄʱºòÁË£¡
> > > ÏÈÀ´¿´¿´MixinµÄʵÏÖ°É£º
> > > class Fruit(object):
> > >  pass
> > > class GiftMixin(object):
> > >  def is_gift_fruit(self):
> > >   return True
> > > class NotGiftMixin(object):
> > >  def is_gift_fruit(self):
> > >   return False
> > > class PareMixin(object):
> > >  def eat_method(self):
> > >   return 'Pare'
> > > class HuskMixin(object):
> > >  def eat_method(self):
> > >   return 'Husk'
> > > class Apple(GiftMixin, PareMixin, Fruit):pass
> > > class Orange(GiftMixin, HuskMixin, Fruit):pass
> > > class Pear(NotGiftMixin, PareMixin, Fruit):pass
> > > class Banana(NotGiftMixin, HuskMixin, Fruit):pass
> > > ±àÂëÍê³É£¡Õâ¾ÍÊÇMixin£¬¾ÍÊÇÕâô¼òµ¥£¬ÒÔÖÂÎÒÎÞ·¨ÔÙ˵³öÈκÎÑÔÓÒòΪÎÒ¾õµÃÉÏÃæµÄ´úÂëÒѾ­ÍêÕûµØ±í´ïÁËÎÒÏëÒª±í´ïµÄ˼Ïë¡£
> > > ×¢Òâ, ÒòΪ Python ÀïÃæ¶àÖؼ̳ÐʱÈç¹û±»µ÷ÓõijÉÔ±º¯ÊýÖ»´æÔÚÓÚ¸¸ÀàÖУ¬Ôò°´ÀàÉùÃ÷µÄ¸¸Àà´Ó×óµ½ÓÒ²éÕÒµ÷ÓõÄ, ËùÒÔÖ÷Àà±»·ÅÔÚÓÒ±ß,
> > > MixIn ±»·ÅÔÚ×ó±ß£¬²ÅÄÜÕýÈ·µØµ÷Óõ½MixinµÄ³ÉÔ±º¯Êý¡£
> > > MixinµÄºÃ´¦ÊÇ¿ÉÒÔΪÖ÷ÀࣨÈçFruit£©Ìí¼ÓÈÎÒâ¶àµÄMixinÀ´ÊµÏÖ¶à̬£¬±ÈÈç¸Õ²Å˵µÄË®¹ûÓнø¿ÚºÍ¹ú²úÁ½¸öÌØÕ÷£¬ÏÖÔÚÏ൱ÈÝÒ×ʵÏÖ£º
> > > class NativeMixin(object):
> > >  def Locality(self):
> > >   return 'Native'
> > > class ForeignMixin(object):
> > >  def Locality(self):
> > >   return 'Foreign'
> > > class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #½ø¿Úºì¸»Ê¿
> > > class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
> > > class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
> > > class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
> > > ¼òµ¥¶àÁË£¬Ö»¼ÓÁËÁ½¸öÀ࣬¶ÔAOPBµÄʵÏÖÒ²Ö»ÊÇÔö¼ÓÁËÒ»¸ö»ùÀࣨÔö¼Ó×ÜÊÇʤ¹ýÐ޸ģ©¡£
> > > ÀûÓÃMixinÎÒÃÇ»¹¿ÉÒÔÔö¼ÓÎÞÊý×ÜÌØÕ÷£¬¶øÎÞÐè¶ÔÒÑÓдúÂë×÷Ì«´ó¸Ä¶¯¡£
> > >
> > > ÁíÍ⣬ÎÒÃÇ»¹»ñµÃÁË¿ÉÖØÓÃÐÔ¡£±ÈÈçNativeMixinºÍForeignMixin¸úÖ÷ÀàHuman½áºÏ£¬¿ÉÒÔ×ö³ö¹úÈ˺ÍÀÏÍâÁ½¸öÀàŶ¡«Ò²ÐíË®¹ûÁ¬ËøµêÈí¼þÒÔºó»á¿¼ÂǼǼ¹ØÓÚ¿Í»§ÊÇ·ñÍâ¹úÈ˵ÄÐÅÏ¢ÄØ¡£
> > > *³ý´ËÖ®Íâ*
> > > Õâʱºò£¬Äã¿ÉÄÜ»á˵£ºË®¹ûÁ¬ËøµêÈí¼þÖ»ÊÇÄã¶Å׫µÄÒ»¸öÏîÄ¿£¬MixinÓÐʲôʵ¼ÊÓô¦Â𣿵±È»ÓÐÀ²£¡ÆäʵMixin²¢²»ÊÇʲô¸ß½×µÄPython¼¼ÇÉ£¬ÔçÓоͺܶ࿪ԴÏîĿʹÓÃÕâ¸ö¼¼ÇÉÁË£¬µäÐ͵ģ¬±ÈÈçPythonÏîÄ¿°¡£¡
> > > ÔÚPython×Ô´øµÄSocketServer.pyÀï¾ÍÓ¦ÓÃÁËMixinÀ´ÊµÏÖ»ùÓÚ½ø³ÌºÍ»ùÓÚÏ̵߳ÄÁ½ÖÖTCP
> > > /UDP·þÎñÄ£ÐÍ£¬ÔÚTkinterºÍPythonµÄÆäËüÄ£¿éÒ²¿ÉÒÔ¼ûµ½ËüµÄ×Ù¼££¬Èç¹ûÄãÁôÒâµÄ»°¡£
> > > # SocketServer.py ÀïµÄMixin
> > > class ForkingUDPServer(ForkingMixIn, UDPServer): pass
> > > class ForkingTCPServer(ForkingMixIn, TCPServer): pass
> > > class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
> > > class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
> > > È·ÇÐÀ´Ëµ£¬ÎÒ¶ÔMixinÀ´ÊµÏÖµÄË®¹ûÁ¬ËøµêµÄʵÏÖÈÔÈ»Ï൱²»ÂúÒ⣬µ«Èç¹ûÎÒÃÇÏëÒª×ã¹»ÃæÏò¶ÔÏó£¬Ò²¾Í»ù±¾ÉÏÖ»ÄܽÓÊÜÈç´Ë½â¾ö·½°¸ÁË¡£Èç¹ûÓÐÒ»ÌìÄã²»ÄÜÈÌÊÜÿÔö¼ÓÒ»ÖÖÌØÕ÷Äã¾Í±ØÐë±àдN£¨N>=2£©¸öMixin£¬È»ºó¶¼±ØÐë¸øÒѾ­´æÔÚµÄAOPB´úÂëÔö¼ÓÒ»¸ö»ùÀࣨÏëÏ룬ˮ¹ûµêÂôµÄ¿É²»Ö¹ËÄÖÖË®¹û£¬Äã»á¸üÍ·´ó£©£¬ÄÇ£¬¾Í¿¼ÂÇ°ÑOOÅ×Æú°É£¡
> > >
> > > *Ãùл*
> > > ÔÚ±¾ÎijÉÎĹý³ÌÖУ¬ÉòáË(http://eishn.blog.163.com)¸øÎҺܴó°ïÖú£¬ÌØ´ËÃùл¡£
> > >
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to
> > > python-chinese-request在lists.python.cn
> > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> > >
> >
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to
> > python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
>
>
>
> --
> ŬÁ¦×öºÃÿһ¼þÊÂ
> TRY TO DO MY BEST
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/76c3a38b/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 20:17

yi feng yi2369在gmail.com
星期一 六月 18 20:17:40 HKT 2007

俺很菜吗?俺咋看不懂呢?

把一些行为封装起来,这是不是有点策略的味道?

动态语言真是太灵活了,什么事儿都干得出来!晕倒!


在 07-6-18,haur<hekun06 at gmail.com> 写道:
> 难道是,高手过招 ....
>
> 在07-6-18,东子/hydon <hydonlee at gmail.com> 写道:
> > 不错啊...行文相当流畅. 支持.(多根继承? 其实表达的是接口的概念...)
> >
> >
> > 在07-6-18,haur < hekun06 at gmail.com> 写道:
> >
> > > 说什么东西?删除!!!!
> > >
> > >
> > > 在07-6-18,lai yonghao <lanphaday at gmail.com > 写道:
> > > >
> > > >
> > > >
> > > > Mixin 扫盲班
> > > > 赖勇浩(http://blog.csdn.net/lanphaday)
> > > >
> > > > 声明:本文适合初中级Python程序员阅读,另外本文措词可能会导致阅读者不适,敬请PG。
> > > >
> > > > 引子
> > > > 嗯,为什么要谈Mixin啊?
> > > >
> 因为出现了Mixin这样一个东西呀,就像C++社区很多人谈论template一样啊,Python社区也很多会谈论Mixin的(以后会的,嘻嘻),所以我就来凑凑热闹了。
> > > > 嗯,为什么要Mixin呀?
> > > >
> 这个,基本上已经是我这篇文章里要讲的东西了,所以,我会用本文的大部分篇幅来回答你这个超有深度的问题。现在,就开始吧~
> > > > 小时候,我家开百货店,当然,也兼营水果蔬菜啊。
> > > > 小时候的事,总是特别有趣,也特别的有意义,所以今天我们就以水果店开始吧~
> > > >
> 记得,以前很多人买水果的时候,都会问我妈一个问题,就是价格了啦~但还有两个问题也经常问到哦,就是送人应该买什么水果和什么水果可以用来送人?
> > > >
> 嗯,年青人大多都不懂这些礼节。送水果也是很讲兆头的,比如梨和香蕉一般不用来送人,因为它们意味着离别和焦躁哦;而苹果和桔子就很受欢迎,因为它们意味着平安和吉利哦~
> > > > 以此为开始
> > > > 那,这跟Python有什么关系吗?
> > > >
> 当然有啦,不然我扯那么多皮干嘛咧?现在,国产凌凌漆接到一个任务,要求他为一个水果连锁店开发一套软件;显然这个不关心国计民生这些鸡毛蒜皮的小事的武夫是搞不定这项艰巨任务的了,他就找到了你。
> > > >
> 通过调研,客户发现两件事实:一是现在的年青人还是不懂送人应该买什么水果和什么水果可以用来送人这两个问题;二是水果连锁店的营业员100%都是年青人,他们中大部分人也不懂。
> > > > 所以,客户要求在软件中必须提供一个这样的功能--可以查询一种水果是否适宜送人。
> > > > 最初,你可能这样设计:
> > > > class Fruit(object):
> > > >  pass
> > > > 把fruit类作为一切水果的基类,嗯,这相当明智。代码中去除了一些无需关注的代码,如价格、产地等。
> > > > 现在你打算实现最受顾客欢迎的苹果:
> > > > class Apple(Fruit):
> > > >  def is_gift_fruit(self):
> > > >   return True
> > > > 同样的,我又去除了一些无需关注的代码,并且打算在接下来的行文中不再提醒这一点。
> > > > Apple是一种Fruit。所以上面的实现挺符合OO的原则。
> > > > 接下来让我们实现梨子吧:
> > > > class Pear(Fruit):
> > > >  def is_gift_fruit(self):
> > > >   return False
> > > > 解决问题了。如果水果连锁店只卖苹果和梨子两种水果的话。
> > > > 可惜,需求很多,你还要实现桔子和香蕉呢。你写下了这几行代码:
> > > > class Orange(Fruit):
> > > >  def is_gift_fruit(self):
> > > >   return True
> > > > class Banana(Fruit):
> > > >  def is_gift_fruit(self):
> > > >   return False
> > > > 好臭啊,代码的坏味道!
> > > > 类Apple和类Orange除了类名不同,几乎是完全重复的代码;类Pear和类Banana也是一样。
> > > > 更进一层的说,这四个类都差不多啊,所以我们有必要重构一下已有代码,改善它们的设计。
> > > > 改善已有代码
> > > > 阅读代码,你可以发现水果只分两类:一类是可以作为礼品的,一类是不可以的。所以希望可以这样设计:
> > > >   Fruit
> > > >   / \
> > > >  GiftFruit NotGiftFruit
> > > >  / \ / \
> > > > Apple    Orange Pear Banana
> > > > 嗯,加了两个中间类,看起来不错:
> > > > class GiftFruit(Fruit):
> > > >  def is_gift_fruit(self):
> > > >   return True
> > > > class NotGiftFruit(Fruit):
> > > >  def is_gift_fruit(self):
> > > >   return False
> > > > class Apple(GiftFruit):pass
> > > > class Orange(GiftFruit):pass
> > > > class Pear(NotGiftFruit):pass
> > > > class Banana(NotGiftFruit):pass
> > > > 好啦,看上去很不错哦,代码精简了不少,任务完成~
> > > > 新的烦恼
> > > > 接下来我们来完成另一项功能:提供水果食用方法咨询。
> > > >
> 不要笑这个需求,这是真实的市场需求。比如相当部分一辈子生活在北方的朋友就没有吃过龙眼荔枝香蕉;而南方虽然水果丰富,但不知道山竹榴莲等洋水果的也大有人在。我们这个水果连锁店业务简单,水果的食用方法也只分两种:一种是剥皮的,如桔子和香蕉;另一种是削皮的,如苹果和梨子。让我们修改原有的设计:
> > > >    Fruit
> > > >    / \
> > > >   GiftFruit NotGiftFruit
> > > >   / \ /  \
> > > >  PareG...   HuskG... PareNot... HuskNot...
> > > >  /  / /  /
> > > > Apple     Orange  Pear  Banana
> > > > 不得已,我们添加了四个类:
> > > > class PareGiftFruit(GiftFruit):
> > > >  def eat_method(self):
> > > >   return 'Pare'
> > > > class HustGiftFruit(GiftFruit):
> > > >  def eat_method(self):
> > > >   return 'Husk'
> > > > class PareNotGiftFruit(NotGiftFruit):
> > > >  def eat_method(self):
> > > >   return 'Pare'
> > > > class HuskNotGiftFruit(NotGiftFruit):
> > > >  def eat_method(self):
> > > >   return 'Husk'
> > > > 怎么这四个类这么像啊?汗。。。。
> > > > 先忍忍,把AOPB四种水果的实现改改:
> > > > class Apple(PareGiftFruit):pass
> > > > class Orange(HuskGiftFruit):pass
> > > > class Pear(PareNotGiftFruit):Pass
> > > > class Banana(HuskNotGiftFruit):pass
> > > >
> 我已经忍无可忍了。这个设计不仅仅又引入了好不容易消除的重复代码,而且还修改了AOPB这四个类的实现。这种设计的扩展性也不好,如果以后要提供水果的其它特点,比如是进口水果还是国产水果。天啊,这还了得!加上这个特性,我要实现NativePareGiftFruit、NativeHuskGiftFruit等类共8个(2的三次方)啊。水果的特征多得很,随便算算可能超过16种啊,65536个类?叫我去死吧~单是长达16个单词的类名我就崩溃了!
> > > > 现在,你们都应该意识到这种实现方法实在是一种龌龊的设计了。那,我们应该怎么样设计呢?
> > > > Pythonic的方案
> > > > 该是Mixin出场的时候了!
> > > > 先来看看Mixin的实现吧:
> > > > class Fruit(object):
> > > >  pass
> > > > class GiftMixin(object):
> > > >  def is_gift_fruit(self):
> > > >   return True
> > > > class NotGiftMixin(object):
> > > >  def is_gift_fruit(self):
> > > >   return False
> > > > class PareMixin(object):
> > > >  def eat_method(self):
> > > >   return 'Pare'
> > > > class HuskMixin(object):
> > > >  def eat_method(self):
> > > >   return 'Husk'
> > > > class Apple(GiftMixin, PareMixin, Fruit):pass
> > > > class Orange(GiftMixin, HuskMixin, Fruit):pass
> > > > class Pear(NotGiftMixin, PareMixin, Fruit):pass
> > > > class Banana(NotGiftMixin, HuskMixin, Fruit):pass
> > > >
> 编码完成!这就是Mixin,就是这么简单,以致我无法再说出任何言语,因为我觉得上面的代码已经完整地表达了我想要表达的思想。
> > > > 注意, 因为 Python
> 里面多重继承时如果被调用的成员函数只存在于父类中,则按类声明的父类从左到右查找调用的, 所以主类被放在右边,
> MixIn 被放在左边,才能正确地调用到Mixin的成员函数。
> > > >
> Mixin的好处是可以为主类(如Fruit)添加任意多的Mixin来实现多态,比如刚才说的水果有进口和国产两个特征,现在相当容易实现:
> > > > class NativeMixin(object):
> > > >  def Locality(self):
> > > >   return 'Native'
> > > > class ForeignMixin(object):
> > > >  def Locality(self):
> > > >   return 'Foreign'
> > > > class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #进口红富士
> > > > class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
> > > > class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
> > > > class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
> > > > 简单多了,只加了两个类,对AOPB的实现也只是增加了一个基类(增加总是胜过修改)。
> > > > 利用Mixin我们还可以增加无数总特征,而无需对已有代码作太大改动。
> > > >
> 另外,我们还获得了可重用性。比如NativeMixin和ForeignMixin跟主类Human结合,可以做出国人和老外两个类哦~也许水果连锁店软件以后会考虑记录关于客户是否外国人的信息呢。
> > > > 除此之外
> > > >
> 这时候,你可能会说:水果连锁店软件只是你杜撰的一个项目,Mixin有什么实际用处吗?当然有啦!其实Mixin并不是什么高阶的Python技巧,早有就很多开源项目使用这个技巧了,典型的,比如Python项目啊!
> 在Python自带的SocketServer.py里就应用了Mixin来实现基于进程和基于线程的两种TCP/UDP服务模型,在Tkinter和Python的其它模块也可以见到它的踪迹,如果你留意的话。
> > > > # SocketServer.py 里的Mixin
> > > > class ForkingUDPServer(ForkingMixIn, UDPServer): pass
> > > > class ForkingTCPServer(ForkingMixIn, TCPServer): pass
> > > > class ThreadingUDPServer(ThreadingMixIn, UDPServer):
> pass
> > > > class ThreadingTCPServer(ThreadingMixIn, TCPServer):
> pass
> > > >
> 确切来说,我对Mixin来实现的水果连锁店的实现仍然相当不满意,但如果我们想要足够面向对象,也就基本上只能接受如此解决方案了。如果有一天你不能忍受每增加一种特征你就必须编写N(N>=2)个Mixin,然后都必须给已经存在的AOPB代码增加一个基类(想想,水果店卖的可不止四种水果,你会更头大),那,就考虑把OO抛弃吧!
> > > > 鸣谢
> > > > 在本文成文过程中,沈崴(http://eishn.blog.163.com)给我很大帮助,特此鸣谢。
> > > > _______________________________________________
> > > > python-chinese
> > > > Post: send python-chinese at lists.python.cn
> > > > Subscribe: send subscribe to
> python-chinese-request at lists.python.cn
> > > > Unsubscribe: send unsubscribe to
> python-chinese-request at lists.python.cn
> > > > Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
> > > >
> > >
> > >
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese at lists.python.cn
> > > Subscribe: send subscribe to
> python-chinese-request at lists.python.cn
> > > Unsubscribe: send unsubscribe to
> python-chinese-request at lists.python.cn
> > > Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
> > >
> >
> >
> >
> > --
> > 努力做好每一件事
> > TRY TO DO MY BEST
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese at lists.python.cn
> > Subscribe: send subscribe to
> python-chinese-request at lists.python.cn
> > Unsubscribe: send unsubscribe to
> python-chinese-request at lists.python.cn
> > Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
> >
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request at lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 20:44

马宏亮 mhl1983在gmail.com
星期一 六月 18 20:44:38 HKT 2007

PythonÀïûÓнӿÚÂð£¿

ÔÚ07-6-18£¬yi feng <yi2369在gmail.com> дµÀ£º
>
> °³ºÜ²ËÂ𣿰³Õ¦¿´²»¶®ÄØ£¿
>
> °ÑһЩÐÐΪ·â×°ÆðÀ´£¬ÕâÊDz»ÊÇÓеã²ßÂÔµÄζµÀ£¿
>
> ¶¯Ì¬ÓïÑÔÕæÊÇÌ«Áé»îÁË£¬Ê²Ã´Ê¶ù¶¼¸ÉµÃ³öÀ´£¡Ôε¹£¡
>
>
> ÔÚ 07-6-18£¬haur<hekun06在gmail.com> дµÀ£º
> > ÄѵÀÊÇ,¸ßÊÖ¹ýÕÐ ....
> >
> > ÔÚ07-6-18£¬¶«×Ó/hydon <hydonlee在gmail.com> дµÀ£º
> > > ²»´í°¡...ÐÐÎÄÏ൱Á÷³©. Ö§³Ö.(¶à¸ù¼Ì³Ð? Æäʵ±í´ïµÄÊǽӿڵĸÅÄî...)
> > >
> > >
> > > ÔÚ07-6-18£¬haur < hekun06在gmail.com> дµÀ£º
> > >
> > > > ˵ʲô¶«Î÷?ɾ³ý!!!!
> > > >
> > > >
> > > > ÔÚ07-6-18£¬lai yonghao <lanphaday在gmail.com > дµÀ£º
> > > > >
> > > > >
> > > > >
> > > > > Mixin ɨä°à
> > > > > ˵(http://blog.csdn.net/lanphaday)
> > > > >
> > > > > ÉùÃ÷£º±¾ÎÄÊʺϳõÖм¶Python³ÌÐòÔ±ÔĶÁ£¬ÁíÍâ±¾ÎÄ´ë´Ê¿ÉÄܻᵼÖÂÔĶÁÕß²»ÊÊ£¬¾´ÇëPG¡£
> > > > >
> > > > > Òý×Ó
> > > > > àÅ£¬ÎªÊ²Ã´ÒªÌ¸Mixin°¡£¿
> > > > >
> >
> ÒòΪ³öÏÖÁËMixinÕâÑùÒ»¸ö¶«Î÷ѽ£¬¾ÍÏñC++ÉçÇøºÜ¶àÈË̸ÂÛtemplateÒ»Ñù°¡£¬PythonÉçÇøÒ²ºÜ¶à»á̸ÂÛMixinµÄ£¨ÒÔºó»áµÄ£¬ÎûÎû£©£¬ËùÒÔÎÒ¾ÍÀ´´Õ´ÕÈÈÄÖÁË¡£
> > > > > àÅ£¬ÎªÊ²Ã´ÒªMixinѽ£¿
> > > > >
> > Õâ¸ö£¬»ù±¾ÉÏÒѾ­ÊÇÎÒÕâƪÎÄÕÂÀïÒª½²µÄ¶«Î÷ÁË£¬ËùÒÔ£¬ÎÒ»áÓñ¾ÎĵĴ󲿷Öƪ·ùÀ´»Ø´ðÄãÕâ¸ö³¬ÓÐÉî¶ÈµÄÎÊÌâ¡£ÏÖÔÚ£¬¾Í¿ªÊ¼°É¡«
> > > > > Сʱºò£¬ÎÒ¼Ò¿ª°Ù»õµê£¬µ±È»£¬Ò²¼æӪˮ¹ûÊ߲˰¡¡£
> > > > > СʱºòµÄÊ£¬×ÜÊÇÌرðÓÐȤ£¬Ò²ÌرðµÄÓÐÒâÒ壬ËùÒÔ½ñÌìÎÒÃǾÍÒÔË®¹ûµê¿ªÊ¼°É¡«
> > > > >
> > ¼ÇµÃ£¬ÒÔÇ°ºÜ¶àÈËÂòË®¹ûµÄʱºò£¬¶¼»áÎÊÎÒÂèÒ»¸öÎÊÌ⣬¾ÍÊǼ۸ñÁËÀ²¡«µ«»¹ÓÐÁ½¸öÎÊÌâÒ²¾­³£Îʵ½Å¶£¬¾ÍÊÇËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈË£¿
> > > > >
> >
> àÅ£¬ÄêÇàÈË´ó¶à¶¼²»¶®ÕâЩÀñ½Ú¡£ËÍË®¹ûÒ²ÊǺܽ²Õ×Í·µÄ£¬±ÈÈçÀæºÍÏ㽶һ°ã²»ÓÃÀ´ËÍÈË£¬ÒòΪËüÃÇÒâζ×ÅÀë±ðºÍ½¹ÔêŶ£»¶øÆ»¹ûºÍ½Û×ӾͺÜÊÜ»¶Ó­£¬ÒòΪËüÃÇÒâζ×Åƽ°²ºÍ¼ªÀûŶ¡«
> > > > > ÒÔ´ËΪ¿ªÊ¼
> > > > > ÄÇ£¬Õâ¸úPythonÓÐʲô¹ØϵÂð£¿
> > > > >
> >
> µ±È»ÓÐÀ²£¬²»È»ÎÒ³¶ÄÇô¶àƤ¸ÉÂïßÖ£¿ÏÖÔÚ£¬¹ú²úÁèÁèÆá½Óµ½Ò»¸öÈÎÎñ£¬ÒªÇóËûΪһ¸öË®¹ûÁ¬Ëøµê¿ª·¢Ò»Ì×Èí¼þ£»ÏÔÈ»Õâ¸ö²»¹ØÐĹú¼ÆÃñÉúÕâЩ¼¦Ã«ËâƤµÄСʵÄÎä·òÊǸ㲻¶¨ÕâÏî¼è¾ÞÈÎÎñµÄÁË£¬Ëû¾ÍÕÒµ½ÁËÄã¡£
> > > > >
> >
> ͨ¹ýµ÷ÑУ¬¿Í»§·¢ÏÖÁ½¼þÊÂʵ£ºÒ»ÊÇÏÖÔÚµÄÄêÇàÈË»¹ÊDz»¶®ËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈËÕâÁ½¸öÎÊÌ⣻¶þÊÇË®¹ûÁ¬ËøµêµÄÓªÒµÔ±100£¥¶¼ÊÇÄêÇàÈË£¬ËûÃÇÖд󲿷ÖÈËÒ²²»¶®¡£
> > > > > ËùÒÔ£¬¿Í»§ÒªÇóÔÚÈí¼þÖбØÐëÌṩһ¸öÕâÑùµÄ¹¦ÄÜ£­£­¿ÉÒÔ²éѯһÖÖË®¹ûÊÇ·ñÊÊÒËËÍÈË¡£
> > > > > ×î³õ£¬Äã¿ÉÄÜÕâÑùÉè¼Æ£º
> > > > > class Fruit(object):
> > > > >  pass
> > > > > °ÑfruitÀà×÷ΪһÇÐË®¹ûµÄ»ùÀ࣬àÅ£¬ÕâÏ൱Ã÷ÖÇ¡£´úÂëÖÐÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬Èç¼Û¸ñ¡¢²úµØµÈ¡£
> > > > > ÏÖÔÚÄã´òËãʵÏÖ×îÊܹ˿ͻ¶Ó­µÄÆ»¹û£º
> > > > > class Apple(Fruit):
> > > > >  def is_gift_fruit(self):
> > > > >   return True
> > > > > ͬÑùµÄ£¬ÎÒÓÖÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬²¢ÇÒ´òËãÔÚ½ÓÏÂÀ´µÄÐÐÎÄÖв»ÔÙÌáÐÑÕâÒ»µã¡£
> > > > > AppleÊÇÒ»ÖÖFruit¡£ËùÒÔÉÏÃæµÄʵÏÖͦ·ûºÏOOµÄÔ­Ôò¡£
> > > > > ½ÓÏÂÀ´ÈÃÎÒÃÇʵÏÖÀæ×Ó°É£º
> > > > > class Pear(Fruit):
> > > > >  def is_gift_fruit(self):
> > > > >   return False
> > > > > ½â¾öÎÊÌâÁË¡£Èç¹ûË®¹ûÁ¬ËøµêÖ»ÂôÆ»¹ûºÍÀæ×ÓÁ½ÖÖË®¹ûµÄ»°¡£
> > > > > ¿Éϧ£¬ÐèÇóºÜ¶à£¬Ä㻹ҪʵÏÖ½Û×ÓºÍÏ㽶ÄØ¡£ÄãдÏÂÁËÕ⼸ÐдúÂ룺
> > > > > class Orange(Fruit):
> > > > >  def is_gift_fruit(self):
> > > > >   return True
> > > > > class Banana(Fruit):
> > > > >  def is_gift_fruit(self):
> > > > >   return False
> > > > > ºÃ³ô°¡£¬´úÂëµÄ»µÎ¶µÀ£¡
> > > > > ÀàAppleºÍÀàOrange³ýÁËÀàÃû²»Í¬£¬¼¸ºõÊÇÍêÈ«Öظ´µÄ´úÂ룻ÀàPearºÍÀàBananaÒ²ÊÇÒ»Ñù¡£
> > > > > ¸ü½øÒ»²ãµÄ˵£¬ÕâËĸöÀ඼²î²»¶à°¡£¬ËùÒÔÎÒÃÇÓбØÒªÖع¹Ò»ÏÂÒÑÓдúÂ룬¸ÄÉÆËüÃǵÄÉè¼Æ¡£
> > > > > ¸ÄÉÆÒÑÓдúÂë
> > > > > ÔĶÁ´úÂ룬Äã¿ÉÒÔ·¢ÏÖË®¹ûÖ»·ÖÁ½ÀࣺһÀàÊÇ¿ÉÒÔ×÷ΪÀñÆ·µÄ£¬Ò»ÀàÊDz»¿ÉÒԵġ£ËùÒÔÏ£Íû¿ÉÒÔÕâÑùÉè¼Æ£º
> > > > >   Fruit
> > > > >   / \
> > > > >  GiftFruit NotGiftFruit
> > > > >  / \ / \
> > > > > Apple    Orange Pear Banana
> > > > > àÅ£¬¼ÓÁËÁ½¸öÖмäÀ࣬¿´ÆðÀ´²»´í£º
> > > > > class GiftFruit(Fruit):
> > > > >  def is_gift_fruit(self):
> > > > >   return True
> > > > > class NotGiftFruit(Fruit):
> > > > >  def is_gift_fruit(self):
> > > > >   return False
> > > > > class Apple(GiftFruit):pass
> > > > > class Orange(GiftFruit):pass
> > > > > class Pear(NotGiftFruit):pass
> > > > > class Banana(NotGiftFruit):pass
> > > > > ºÃÀ²£¬¿´ÉÏÈ¥ºÜ²»´íŶ£¬´úÂ뾫¼òÁ˲»ÉÙ£¬ÈÎÎñÍê³É¡«
> > > > > еķ³ÄÕ
> > > > > ½ÓÏÂÀ´ÎÒÃÇÀ´Íê³ÉÁíÒ»ÏÄÜ£ºÌṩˮ¹ûʳÓ÷½·¨×Éѯ¡£
> > > > >
> >
> ²»ÒªÐ¦Õâ¸öÐèÇó£¬ÕâÊÇÕæʵµÄÊг¡ÐèÇó¡£±ÈÈçÏ൱²¿·ÖÒ»±²×ÓÉú»îÔÚ±±·½µÄÅóÓѾÍûÓгԹýÁúÑÛÀóÖ¦Ï㽶£»¶øÄÏ·½ËäȻˮ¹û·á¸»£¬µ«²»ÖªµÀɽÖñÁñÁ«µÈÑóË®¹ûµÄÒ²´óÓÐÈËÔÚ¡£ÎÒÃÇÕâ¸öË®¹ûÁ¬ËøµêÒµÎñ¼òµ¥£¬Ë®¹ûµÄʳÓ÷½·¨Ò²Ö»·ÖÁ½ÖÖ£ºÒ»ÖÖÊÇ°þƤµÄ£¬Èç½Û×ÓºÍÏ㽶£»ÁíÒ»ÖÖÊÇÏ÷ƤµÄ£¬ÈçÆ»¹ûºÍÀæ×Ó¡£ÈÃÎÒÃÇÐÞ¸ÄÔ­ÓеÄÉè¼Æ£º
> > > > >    Fruit
> > > > >    / \
> > > > >   GiftFruit NotGiftFruit
> > > > >   / \ /  \
> > > > >  PareG...   HuskG... PareNot... HuskNot...
> > > > >  /  / /  /
> > > > > Apple     Orange  Pear  Banana
> > > > > ²»µÃÒÑ£¬ÎÒÃÇÌí¼ÓÁËËĸöÀࣺ
> > > > > class PareGiftFruit(GiftFruit):
> > > > >  def eat_method(self):
> > > > >   return 'Pare'
> > > > > class HustGiftFruit(GiftFruit):
> > > > >  def eat_method(self):
> > > > >   return 'Husk'
> > > > > class PareNotGiftFruit(NotGiftFruit):
> > > > >  def eat_method(self):
> > > > >   return 'Pare'
> > > > > class HuskNotGiftFruit(NotGiftFruit):
> > > > >  def eat_method(self):
> > > > >   return 'Husk'
> > > > > ÔõôÕâËĸöÀàÕâôÏñ°¡£¿º¹¡£¡£¡£¡£
> > > > > ÏÈÈÌÈÌ£¬°ÑAOPBËÄÖÖË®¹ûµÄʵÏָĸģº
> > > > > class Apple(PareGiftFruit):pass
> > > > > class Orange(HuskGiftFruit):pass
> > > > > class Pear(PareNotGiftFruit):Pass
> > > > > class Banana(HuskNotGiftFruit):pass
> > > > >
> >
> ÎÒÒѾ­ÈÌÎÞ¿ÉÈÌÁË¡£Õâ¸öÉè¼Æ²»½ö½öÓÖÒýÈëÁ˺ò»ÈÝÒ×Ïû³ýµÄÖظ´´úÂ룬¶øÇÒ»¹ÐÞ¸ÄÁËAOPBÕâËĸöÀàµÄʵÏÖ¡£ÕâÖÖÉè¼ÆµÄÀ©Õ¹ÐÔÒ²²»ºÃ£¬Èç¹ûÒÔºóÒªÌṩˮ¹ûµÄÆäËüÌص㣬±ÈÈçÊǽø¿ÚË®¹û»¹Êǹú²úË®¹û¡£Ìì°¡£¬Õ⻹Á˵㡼ÓÉÏÕâ¸öÌØÐÔ£¬ÎÒҪʵÏÖNativePareGiftFruit¡¢NativeHuskGiftFruitµÈÀ๲8¸ö£¨2µÄÈý´Î·½£©°¡¡£Ë®¹ûµÄÌØÕ÷¶àµÃºÜ£¬Ëæ±ãËãËã¿ÉÄܳ¬¹ý16ÖÖ°¡£¬65536¸öÀࣿ½ÐÎÒÈ¥ËÀ°É¡«µ¥Êdz¤´ï16¸öµ¥´ÊµÄÀàÃûÎҾͱÀÀ£ÁË£¡
> > > > > ÏÖÔÚ£¬ÄãÃǶ¼Ó¦¸ÃÒâʶµ½ÕâÖÖʵÏÖ·½·¨ÊµÔÚÊÇÒ»ÖÖö»öºµÄÉè¼ÆÁË¡£ÄÇ£¬ÎÒÃÇÓ¦¸ÃÔõôÑùÉè¼ÆÄØ£¿
> > > > > PythonicµÄ·½°¸
> > > > > ¸ÃÊÇMixin³ö³¡µÄʱºòÁË£¡
> > > > > ÏÈÀ´¿´¿´MixinµÄʵÏÖ°É£º
> > > > > class Fruit(object):
> > > > >  pass
> > > > > class GiftMixin(object):
> > > > >  def is_gift_fruit(self):
> > > > >   return True
> > > > > class NotGiftMixin(object):
> > > > >  def is_gift_fruit(self):
> > > > >   return False
> > > > > class PareMixin(object):
> > > > >  def eat_method(self):
> > > > >   return 'Pare'
> > > > > class HuskMixin(object):
> > > > >  def eat_method(self):
> > > > >   return 'Husk'
> > > > > class Apple(GiftMixin, PareMixin, Fruit):pass
> > > > > class Orange(GiftMixin, HuskMixin, Fruit):pass
> > > > > class Pear(NotGiftMixin, PareMixin, Fruit):pass
> > > > > class Banana(NotGiftMixin, HuskMixin, Fruit):pass
> > > > >
> > ±àÂëÍê³É£¡Õâ¾ÍÊÇMixin£¬¾ÍÊÇÕâô¼òµ¥£¬ÒÔÖÂÎÒÎÞ·¨ÔÙ˵³öÈκÎÑÔÓÒòΪÎÒ¾õµÃÉÏÃæµÄ´úÂëÒѾ­ÍêÕûµØ±í´ïÁËÎÒÏëÒª±í´ïµÄ˼Ïë¡£
> > > > > ×¢Òâ, ÒòΪ Python
> > ÀïÃæ¶àÖؼ̳ÐʱÈç¹û±»µ÷ÓõijÉÔ±º¯ÊýÖ»´æÔÚÓÚ¸¸ÀàÖУ¬Ôò°´ÀàÉùÃ÷µÄ¸¸Àà´Ó×óµ½ÓÒ²éÕÒµ÷ÓõÄ, ËùÒÔÖ÷Àà±»·ÅÔÚÓÒ±ß,
> > MixIn ±»·ÅÔÚ×ó±ß£¬²ÅÄÜÕýÈ·µØµ÷Óõ½MixinµÄ³ÉÔ±º¯Êý¡£
> > > > >
> > MixinµÄºÃ´¦ÊÇ¿ÉÒÔΪÖ÷ÀࣨÈçFruit£©Ìí¼ÓÈÎÒâ¶àµÄMixinÀ´ÊµÏÖ¶à̬£¬±ÈÈç¸Õ²Å˵µÄË®¹ûÓнø¿ÚºÍ¹ú²úÁ½¸öÌØÕ÷£¬ÏÖÔÚÏ൱ÈÝÒ×ʵÏÖ£º
> > > > > class NativeMixin(object):
> > > > >  def Locality(self):
> > > > >   return 'Native'
> > > > > class ForeignMixin(object):
> > > > >  def Locality(self):
> > > > >   return 'Foreign'
> > > > > class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #½ø¿Úºì¸»Ê¿
> > > > > class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
> > > > > class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
> > > > > class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
> > > > > ¼òµ¥¶àÁË£¬Ö»¼ÓÁËÁ½¸öÀ࣬¶ÔAOPBµÄʵÏÖÒ²Ö»ÊÇÔö¼ÓÁËÒ»¸ö»ùÀࣨÔö¼Ó×ÜÊÇʤ¹ýÐ޸ģ©¡£
> > > > > ÀûÓÃMixinÎÒÃÇ»¹¿ÉÒÔÔö¼ÓÎÞÊý×ÜÌØÕ÷£¬¶øÎÞÐè¶ÔÒÑÓдúÂë×÷Ì«´ó¸Ä¶¯¡£
> > > > >
> >
> ÁíÍ⣬ÎÒÃÇ»¹»ñµÃÁË¿ÉÖØÓÃÐÔ¡£±ÈÈçNativeMixinºÍForeignMixin¸úÖ÷ÀàHuman½áºÏ£¬¿ÉÒÔ×ö³ö¹úÈ˺ÍÀÏÍâÁ½¸öÀàŶ¡«Ò²ÐíË®¹ûÁ¬ËøµêÈí¼þÒÔºó»á¿¼ÂǼǼ¹ØÓÚ¿Í»§ÊÇ·ñÍâ¹úÈ˵ÄÐÅÏ¢ÄØ¡£
> > > > > ³ý´ËÖ®Íâ
> > > > >
> >
> Õâʱºò£¬Äã¿ÉÄÜ»á˵£ºË®¹ûÁ¬ËøµêÈí¼þÖ»ÊÇÄã¶Å׫µÄÒ»¸öÏîÄ¿£¬MixinÓÐʲôʵ¼ÊÓô¦Â𣿵±È»ÓÐÀ²£¡ÆäʵMixin²¢²»ÊÇʲô¸ß½×µÄPython¼¼ÇÉ£¬ÔçÓоͺܶ࿪ԴÏîĿʹÓÃÕâ¸ö¼¼ÇÉÁË£¬µäÐ͵ģ¬±ÈÈçPythonÏîÄ¿°¡£¡
> > ÔÚPython×Ô´øµÄSocketServer.pyÀï¾ÍÓ¦ÓÃÁËMixinÀ´ÊµÏÖ»ùÓÚ½ø³ÌºÍ»ùÓÚÏ̵߳ÄÁ½ÖÖTCP
> /UDP·þÎñÄ£ÐÍ£¬ÔÚTkinterºÍPythonµÄÆäËüÄ£¿éÒ²¿ÉÒÔ¼ûµ½ËüµÄ×Ù¼££¬Èç¹ûÄãÁôÒâµÄ»°¡£
> > > > > # SocketServer.py ÀïµÄMixin
> > > > > class ForkingUDPServer(ForkingMixIn, UDPServer): pass
> > > > > class ForkingTCPServer(ForkingMixIn, TCPServer): pass
> > > > > class ThreadingUDPServer(ThreadingMixIn, UDPServer):
> > pass
> > > > > class ThreadingTCPServer(ThreadingMixIn, TCPServer):
> > pass
> > > > >
> >
> È·ÇÐÀ´Ëµ£¬ÎÒ¶ÔMixinÀ´ÊµÏÖµÄË®¹ûÁ¬ËøµêµÄʵÏÖÈÔÈ»Ï൱²»ÂúÒ⣬µ«Èç¹ûÎÒÃÇÏëÒª×ã¹»ÃæÏò¶ÔÏó£¬Ò²¾Í»ù±¾ÉÏÖ»ÄܽÓÊÜÈç´Ë½â¾ö·½°¸ÁË¡£Èç¹ûÓÐÒ»ÌìÄã²»ÄÜÈÌÊÜÿÔö¼ÓÒ»ÖÖÌØÕ÷Äã¾Í±ØÐë±àдN£¨N>=2£©¸öMixin£¬È»ºó¶¼±ØÐë¸øÒѾ­´æÔÚµÄAOPB´úÂëÔö¼ÓÒ»¸ö»ùÀࣨÏëÏ룬ˮ¹ûµêÂôµÄ¿É²»Ö¹ËÄÖÖË®¹û£¬Äã»á¸üÍ·´ó£©£¬ÄÇ£¬¾Í¿¼ÂÇ°ÑOOÅ×Æú°É£¡
> > > > > Ãùл
> > > > > ÔÚ±¾ÎijÉÎĹý³ÌÖУ¬ÉòáË(http://eishn.blog.163.com)¸øÎҺܴó°ïÖú£¬ÌØ´ËÃùл¡£
> > > > > _______________________________________________
> > > > > python-chinese
> > > > > Post: send python-chinese在lists.python.cn
> > > > > Subscribe: send subscribe to
> > python-chinese-request在lists.python.cn
> > > > > Unsubscribe: send unsubscribe to
> > python-chinese-request在lists.python.cn
> > > > > Detail Info:
> > http://python.cn/mailman/listinfo/python-chinese
> > > > >
> > > >
> > > >
> > > > _______________________________________________
> > > > python-chinese
> > > > Post: send python-chinese在lists.python.cn
> > > > Subscribe: send subscribe to
> > python-chinese-request在lists.python.cn
> > > > Unsubscribe: send unsubscribe to
> > python-chinese-request在lists.python.cn
> > > > Detail Info:
> > http://python.cn/mailman/listinfo/python-chinese
> > > >
> > >
> > >
> > >
> > > --
> > > ŬÁ¦×öºÃÿһ¼þÊÂ
> > > TRY TO DO MY BEST
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to
> > python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to
> > python-chinese-request在lists.python.cn
> > > Detail Info:
> > http://python.cn/mailman/listinfo/python-chinese
> > >
> >
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to
> > python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to
> > python-chinese-request在lists.python.cn
> > Detail Info:
> > http://python.cn/mailman/listinfo/python-chinese
> >
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese




-- 
ÂíºêÁÁ
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/7b0423a3/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 21:53

头太晕 torrycn在gmail.com
星期一 六月 18 21:53:04 HKT 2007

ÔÚ07-6-18£¬ÂíºêÁÁ <mhl1983在gmail.com> дµÀ£º
>
> PythonÀïûÓнӿÚÂð£¿


Õâ±È½Ó¿ÚÁé»î¶àÁË¡£¡£¡£

¶¥Â¥Ö÷¡£¡£¡£¡£ ¶¥Â¥Ö÷µÄÉö¡£¡£¡£¡£¸Ú¸ÚµÄ¶¥¡£¡£¡£¡£
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/f82f8394/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 22:06

马宏亮 mhl1983在gmail.com
星期一 六月 18 22:06:54 HKT 2007

ΪʲôÁé»î¶àÁË?Õâ²»¸ú½Ó¿ÚÒ»ÑùµÄÄ¿µÄÂð£¿

ÔÚ07-6-18£¬Í·Ì«ÔÎ <torrycn在gmail.com> дµÀ£º
>
>
>
> ÔÚ07-6-18£¬ÂíºêÁÁ <mhl1983在gmail.com> дµÀ£º
> >
> > PythonÀïûÓнӿÚÂð£¿
>
>
> Õâ±È½Ó¿ÚÁé»î¶àÁË¡£¡£¡£
>
> ¶¥Â¥Ö÷¡£¡£¡£¡£ ¶¥Â¥Ö÷µÄÉö¡£¡£¡£¡£¸Ú¸ÚµÄ¶¥¡£¡£¡£¡£
>
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
ÂíºêÁÁ
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/aee81274/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月18日 星期一 22:21

头太晕 torrycn在gmail.com
星期一 六月 18 22:21:26 HKT 2007

ÔÚ07-6-18£¬ÂíºêÁÁ <mhl1983在gmail.com> дµÀ£º
>
> ΪʲôÁé»î¶àÁË?Õâ²»¸ú½Ó¿ÚÒ»ÑùµÄÄ¿µÄÂð£¿


Ä¿µÄÒ»Ñù£¬×öµÄ¹¤×÷ÉÙÁË¡£
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070618/320931a9/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 09:55

东子/hydon hydonlee在gmail.com
星期二 六月 19 09:55:34 HKT 2007

接口不提供实现, Mixin提供了实现(默认的实现? 可以重写吗?)

在07-6-18,头太晕 <torrycn at gmail.com> 写道:
>
>
>
> 在07-6-18,马宏亮 <mhl1983 at gmail.com> 写道:
> >
> > 为什么灵活多了?这不跟接口一样的目的吗?
>
>
> 目的一样,做的工作少了。
>
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
努力做好每一件事
TRY TO DO MY BEST
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://python.cn/pipermail/python-chinese/attachments/20070619/0f5aa014/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 14:03

大郎 iexper在gmail.com
星期二 六月 19 14:03:25 HKT 2007

ÎÒÖ»ÄÜ˵ÕâÊÇÎÒ¶Áµ½×îºÃµÄ˵½ÌʽµÄPythonÎÄÕ¡£
Ô¶±ÈÄÇЩ¸Ï¸É°Í°ÍµÄÀý×ÓÉú¶¯µÃ¶à£¬ÆäʵÕâÀï˵Ã÷ÁËÁ½µã£º

1, ÊÇ¿ª·¢Ë¼ÏëºÍ¿ª·¢·½·¨
2, python±¾Éí½Ì³Ì

Ö»ÊÇ¿´µ½¶þÂ¥ÉϵĻظ´£¬ÈÃÈËÓÐЩº®ÐÄ¡£

On 6/19/07, ¶«×Ó/hydon <hydonlee在gmail.com> wrote:
>
> ½Ó¿Ú²»ÌṩʵÏÖ, MixinÌṩÁËʵÏÖ(ĬÈϵÄʵÏÖ? ¿ÉÒÔÖØдÂð?)
>
> ÔÚ07-6-18£¬Í·Ì«ÔÎ <torrycn在gmail.com> дµÀ£º
> >
> >
> >
> > ÔÚ07-6-18£¬ÂíºêÁÁ <mhl1983在gmail.com > дµÀ£º
> > >
> > > ΪʲôÁé»î¶àÁË?Õâ²»¸ú½Ó¿ÚÒ»ÑùµÄÄ¿µÄÂð£¿
> >
> >
> > Ä¿µÄÒ»Ñù£¬×öµÄ¹¤×÷ÉÙÁË¡£
> >
> >
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to
> > python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
>
>
>
> --
> ŬÁ¦×öºÃÿһ¼þÊÂ
> TRY TO DO MY BEST
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
ÎÒ×ßµ½Ò»¸öÄ°ÉúµÄµØ·½, ¸æËß±ðÈË ÎÒҪȥÁ÷ÀË
Ŷ£¬ÎÒҪȥÁÆÉË¡­¡­

Gtalk: iexper(at)gmail.com
ÓòÃû¹ýÆÚÁË
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070619/fb13f876/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 17:29

HoLin holin.he在gmail.com
星期二 六月 19 17:29:00 HKT 2007

ºÜ²»´í£¬Ï²»¶ÕâÑùµÄ·½Ê½¡£
Ô­±¾Àí½âµÄMixInÊÇ¿ÉÒÔinclude½øÀ´µÄ·½·¨£¬ÔÚµ±Ç°ÎļþÀïÃæ¿ÉÒÔÖ±½Óµ÷Óá£PythonûÔõôÓùý¡£= =£¡

ÔÚ07-6-19£¬´óÀÉ <iexper在gmail.com> дµÀ£º
>
> ÎÒÖ»ÄÜ˵ÕâÊÇÎÒ¶Áµ½×îºÃµÄ˵½ÌʽµÄPythonÎÄÕ¡£
> Ô¶±ÈÄÇЩ¸Ï¸É°Í°ÍµÄÀý×ÓÉú¶¯µÃ¶à£¬ÆäʵÕâÀï˵Ã÷ÁËÁ½µã£º
>
> 1, ÊÇ¿ª·¢Ë¼ÏëºÍ¿ª·¢·½·¨
> 2, python±¾Éí½Ì³Ì
>
> Ö»ÊÇ¿´µ½¶þÂ¥ÉϵĻظ´£¬ÈÃÈËÓÐЩº®ÐÄ¡£
>
> On 6/19/07, ¶«×Ó/hydon < hydonlee在gmail.com> wrote:
> >
> > ½Ó¿Ú²»ÌṩʵÏÖ, MixinÌṩÁËʵÏÖ(ĬÈϵÄʵÏÖ? ¿ÉÒÔÖØдÂð?)
> >
> > ÔÚ07-6-18£¬Í·Ì«ÔÎ <torrycn在gmail.com> дµÀ£º
> > >
> > >
> > >
> > > ÔÚ07-6-18£¬ÂíºêÁÁ <mhl1983在gmail.com > дµÀ£º
> > > >
> > > > ΪʲôÁé»î¶àÁË?Õâ²»¸ú½Ó¿ÚÒ»ÑùµÄÄ¿µÄÂð£¿
> > >
> > >
> > > Ä¿µÄÒ»Ñù£¬×öµÄ¹¤×÷ÉÙÁË¡£
> > >
> > >
> > >
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to
> > > python-chinese-request在lists.python.cn
> > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> > >
> >
> >
> >
> > --
> > ŬÁ¦×öºÃÿһ¼þÊÂ
> > TRY TO DO MY BEST
> >
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to
> > python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
>
>
>
> --
> ÎÒ×ßµ½Ò»¸öÄ°ÉúµÄµØ·½, ¸æËß±ðÈË ÎÒҪȥÁ÷ÀË
> Ŷ£¬ÎÒҪȥÁÆÉË¡­¡­
>
> Gtalk: iexper(at)gmail.com
> ÓòÃû¹ýÆÚÁË
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
Regards
HoLin
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070619/ca30cdf2/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 17:45

3751 lwm3751在gmail.com
星期二 六月 19 17:45:32 HKT 2007

在07-6-19,大郎 <iexper at gmail.com> 写道:

> 只是看到二楼上的回复,让人有些寒心。

我倒是觉得哭笑不得。
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://python.cn/pipermail/python-chinese/attachments/20070619/b774f8b6/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 19:58

王超凡 wangchaofan在gmail.com
星期二 六月 19 19:58:44 HKT 2007

ÕæÓÐɨäµÄЧ¹û

ÔÚ07-6-19£¬3751 <lwm3751在gmail.com> дµÀ£º
>
> ÔÚ07-6-19£¬´óÀÉ <iexper在gmail.com> дµÀ£º
>
> > Ö»ÊÇ¿´µ½¶þÂ¥ÉϵĻظ´£¬ÈÃÈËÓÐЩº®ÐÄ¡£
>
> ÎÒµ¹ÊǾõµÃ¿ÞЦ²»µÃ¡£
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070619/77f26fd7/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 21:13

SpitFire spitfire2在gmail.com
星期二 六月 19 21:13:59 HKT 2007

多重继承有时候的确有用,有些需求如果不使用多重继承是比较难做的(c++还是强大啊),不过目前大多数语言都只是支持多接口,面向接口编程也是现在一大趋势了,代码重用不是OO的重点

在07-6-18,lai yonghao <lanphaday在gmail.com> 写道:
>
> Mixin 扫盲班
> 赖勇浩(http://blog.csdn.net/lanphaday)
>
> 声明:本文适合初中级Python程序员阅读,另外本文措词可能会导致阅读者不适,敬请PG。
>
> *引子*
> 嗯,为什么要谈Mixin啊?
>
> 因为出现了Mixin这样一个东西呀,就像C++社区很多人谈论template一样啊,Python社区也很多会谈论Mixin的(以后会的,嘻嘻),所以我就来凑凑热闹了。
> 嗯,为什么要Mixin呀?
> 这个,基本上已经是我这篇文章里要讲的东西了,所以,我会用本文的大部分篇幅来回答你这个超有深度的问题。现在,就开始吧~
> 小时候,我家开百货店,当然,也兼营水果蔬菜啊。
> 小时候的事,总是特别有趣,也特别的有意义,所以今天我们就以水果店开始吧~
> 记得,以前很多人买水果的时候,都会问我妈一个问题,就是价格了啦~但还有两个问题也经常问到哦,就是送人应该买什么水果和什么水果可以用来送人?
> 嗯,年青人大多都不懂这些礼节。送水果也是很讲兆头的,比如梨和香蕉一般不用来送人,因为它们意味着离别和焦躁哦;而苹果和桔子就很受欢迎,因为它们意味着平安和吉利哦~
>
> *以此为开始*
> 那,这跟Python有什么关系吗?
>
> 当然有啦,不然我扯那么多皮干嘛咧?现在,国产凌凌漆接到一个任务,要求他为一个水果连锁店开发一套软件;显然这个不关心国计民生这些鸡毛蒜皮的小事的武夫是搞不定这项艰巨任务的了,他就找到了你。
> 通过调研,客户发现两件事实:一是现在的年青人还是不懂送人应该买什么水果和什么水果可以用来送人这两个问题;二是水果连锁店的营业员100%都是年青人,他们中大部分人也不懂。
>
> 所以,客户要求在软件中必须提供一个这样的功能--可以查询一种水果是否适宜送人。
> 最初,你可能这样设计:
> class Fruit(object):
>  pass
> 把fruit类作为一切水果的基类,嗯,这相当明智。代码中去除了一些无需关注的代码,如价格、产地等。
> 现在你打算实现最受顾客欢迎的苹果:
> class Apple(Fruit):
>  def is_gift_fruit(self):
>   return True
> 同样的,我又去除了一些无需关注的代码,并且打算在接下来的行文中不再提醒这一点。
> Apple是一种Fruit。所以上面的实现挺符合OO的原则。
> 接下来让我们实现梨子吧:
> class Pear(Fruit):
>  def is_gift_fruit(self):
>   return False
> 解决问题了。如果水果连锁店只卖苹果和梨子两种水果的话。
> 可惜,需求很多,你还要实现桔子和香蕉呢。你写下了这几行代码:
> class Orange(Fruit):
>  def is_gift_fruit(self):
>   return True
> class Banana(Fruit):
>  def is_gift_fruit(self):
>   return False
> 好臭啊,代码的坏味道!
> 类Apple和类Orange除了类名不同,几乎是完全重复的代码;类Pear和类Banana也是一样。
> 更进一层的说,这四个类都差不多啊,所以我们有必要重构一下已有代码,改善它们的设计。
> 改善已有代码
> 阅读代码,你可以发现水果只分两类:一类是可以作为礼品的,一类是不可以的。所以希望可以这样设计:
>   Fruit
>   / \
>  GiftFruit NotGiftFruit
>  / \ / \
> Apple    Orange Pear Banana
> 嗯,加了两个中间类,看起来不错:
> class GiftFruit(Fruit):
>  def is_gift_fruit(self):
>   return True
> class NotGiftFruit(Fruit):
>  def is_gift_fruit(self):
>   return False
> class Apple(GiftFruit):pass
> class Orange(GiftFruit):pass
> class Pear(NotGiftFruit):pass
> class Banana(NotGiftFruit):pass
> 好啦,看上去很不错哦,代码精简了不少,任务完成~
> *新的烦恼*
> 接下来我们来完成另一项功能:提供水果食用方法咨询。
> 不要笑这个需求,这是真实的市场需求。比如相当部分一辈子生活在北方的朋友就没有吃过龙眼荔枝香蕉;而南方虽然水果丰富,但不知道山竹榴莲等洋水果的也大有人在。我们这个水果连锁店业务简单,水果的食用方法也只分两种:一种是剥皮的,如桔子和香蕉;另一种是削皮的,如苹果和梨子。让我们修改原有的设计:
>
>    Fruit
>    / \
>   GiftFruit NotGiftFruit
>   / \ /  \
>  PareG...   HuskG... PareNot... HuskNot...
>  /  / /  /
> Apple     Orange  Pear  Banana
> 不得已,我们添加了四个类:
> class PareGiftFruit(GiftFruit):
>  def eat_method(self):
>   return 'Pare'
> class HustGiftFruit(GiftFruit):
>  def eat_method(self):
>   return 'Husk'
> class PareNotGiftFruit(NotGiftFruit):
>  def eat_method(self):
>   return 'Pare'
> class HuskNotGiftFruit(NotGiftFruit):
>  def eat_method(self):
>   return 'Husk'
> 怎么这四个类这么像啊?汗。。。。
> 先忍忍,把AOPB四种水果的实现改改:
> class Apple(PareGiftFruit):pass
> class Orange(HuskGiftFruit):pass
> class Pear(PareNotGiftFruit):Pass
> class Banana(HuskNotGiftFruit):pass
> 我已经忍无可忍了。这个设计不仅仅又引入了好不容易消除的重复代码,而且还修改了AOPB这四个类的实现。这种设计的扩展性也不好,如果以后要提供水果的其它特点,比如是进口水果还是国产水果。天啊,这还了得!加上这个特性,我要实现NativePareGiftFruit、NativeHuskGiftFruit等类共8个(2的三次方)啊。水果的特征多得很,随便算算可能超过16种啊,65536个类?叫我去死吧~单是长达16个单词的类名我就崩溃了!
>
> 现在,你们都应该意识到这种实现方法实在是一种龌龊的设计了。那,我们应该怎么样设计呢?
> *Pythonic的方案*
> 该是Mixin出场的时候了!
> 先来看看Mixin的实现吧:
> class Fruit(object):
>  pass
> class GiftMixin(object):
>  def is_gift_fruit(self):
>   return True
> class NotGiftMixin(object):
>  def is_gift_fruit(self):
>   return False
> class PareMixin(object):
>  def eat_method(self):
>   return 'Pare'
> class HuskMixin(object):
>  def eat_method(self):
>   return 'Husk'
> class Apple(GiftMixin, PareMixin, Fruit):pass
> class Orange(GiftMixin, HuskMixin, Fruit):pass
> class Pear(NotGiftMixin, PareMixin, Fruit):pass
> class Banana(NotGiftMixin, HuskMixin, Fruit):pass
> 编码完成!这就是Mixin,就是这么简单,以致我无法再说出任何言语,因为我觉得上面的代码已经完整地表达了我想要表达的思想。
> 注意, 因为 Python 里面多重继承时如果被调用的成员函数只存在于父类中,则按类声明的父类从左到右查找调用的, 所以主类被放在右边, MixIn
> 被放在左边,才能正确地调用到Mixin的成员函数。
> Mixin的好处是可以为主类(如Fruit)添加任意多的Mixin来实现多态,比如刚才说的水果有进口和国产两个特征,现在相当容易实现:
> class NativeMixin(object):
>  def Locality(self):
>   return 'Native'
> class ForeignMixin(object):
>  def Locality(self):
>   return 'Foreign'
> class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #进口红富士
> class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
> class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
> class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
> 简单多了,只加了两个类,对AOPB的实现也只是增加了一个基类(增加总是胜过修改)。
> 利用Mixin我们还可以增加无数总特征,而无需对已有代码作太大改动。
>
> 另外,我们还获得了可重用性。比如NativeMixin和ForeignMixin跟主类Human结合,可以做出国人和老外两个类哦~也许水果连锁店软件以后会考虑记录关于客户是否外国人的信息呢。
> *除此之外*
> 这时候,你可能会说:水果连锁店软件只是你杜撰的一个项目,Mixin有什么实际用处吗?当然有啦!其实Mixin并不是什么高阶的Python技巧,早有就很多开源项目使用这个技巧了,典型的,比如Python项目啊!
> 在Python自带的SocketServer.py里就应用了Mixin来实现基于进程和基于线程的两种TCP
> /UDP服务模型,在Tkinter和Python的其它模块也可以见到它的踪迹,如果你留意的话。
> # SocketServer.py 里的Mixin
> class ForkingUDPServer(ForkingMixIn, UDPServer): pass
> class ForkingTCPServer(ForkingMixIn, TCPServer): pass
> class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
> class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
> 确切来说,我对Mixin来实现的水果连锁店的实现仍然相当不满意,但如果我们想要足够面向对象,也就基本上只能接受如此解决方案了。如果有一天你不能忍受每增加一种特征你就必须编写N(N>=2)个Mixin,然后都必须给已经存在的AOPB代码增加一个基类(想想,水果店卖的可不止四种水果,你会更头大),那,就考虑把OO抛弃吧!
>
> *鸣谢*
> 在本文成文过程中,沈崴(http://eishn.blog.163.com)给我很大帮助,特此鸣谢。
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
SpitFire
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070619/7869370a/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 21:28

马宏亮 mhl1983在gmail.com
星期二 六月 19 21:28:31 HKT 2007

¿´Ôõô¶¨ÒåÖØÓÃÁË£¬Èç¹ûÖ»ÊÇΪÁËÉÙд´úÂë¶ø½øÐм̳У¬ÊµÔÚÊÇû̫´óÒâÒå

ÔÚ07-6-19£¬SpitFire <spitfire2在gmail.com> дµÀ£º
>
>
> ¶àÖؼ̳ÐÓÐʱºòµÄÈ·ÓÐÓã¬ÓÐЩÐèÇóÈç¹û²»Ê¹ÓöàÖؼ̳ÐÊDZȽÏÄÑ×öµÄ£¨c++»¹ÊÇÇ¿´ó°¡£©£¬²»¹ýÄ¿Ç°´ó¶àÊýÓïÑÔ¶¼Ö»ÊÇÖ§³Ö¶à½Ó¿Ú£¬ÃæÏò½Ó¿Ú±à³ÌÒ²ÊÇÏÖÔÚÒ»´óÇ÷ÊÆÁË£¬´úÂëÖØÓò»ÊÇOOµÄÖصã
>
> ÔÚ07-6-18£¬lai yonghao <lanphaday在gmail.com > дµÀ£º
>
>
>
> --
> SpitFire
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
ÂíºêÁÁ
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070619/924ce153/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月19日 星期二 23:16

FireBird ygonic在gmail.com
星期二 六月 19 23:16:52 HKT 2007

see limodo blog

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月20日 星期三 09:55

Liming_Do Liming_Do在smics.com
星期三 六月 20 09:55:23 HKT 2007

·Ç³£Åå·þÂ¥Ö÷ÎÞ˽¹±Ï×µÄÎÄÕ£¬ÖªÊ¶·á¸»»îÆÃÐÎÏó£¬ÊÜÒæ·Çdz£¡
MixInÊÇÔÚÔËÐÐÆÚ½«·½·¨¶¯Ì¬¸³ÓèÒѾ­ÊµÀý»¯µÄ³ÉÔ±
µ«ÊÇÐÖµÜÈõÈõµÄÈÏΪÕâ¸öÀý×ÓÊǶàÖؼ̳У¬²»ÄܳÆ×÷MixIn
¶øÄúµÄ´úÂëÔÚʵÀý»¯µÄʱºòÒѾ­È·¶¨ÁË£¨ÉÁÒ»¸öÏÈ£¬ÃâµÃ±»±â@_@£©
²»Ê¹ÓöàÖؼ̳еĻ°£¬ÕâÊÇÎÒ¾õµÃºÃÍæ¶ùµÄд·¨:
 
#!/usr/bin/env python
#
# Copyright(c) 2007 Leon Dong
# E-mail : Leon.Dong在gmail.com
#
 
class Fruit(type):
    
    def __new__(cls, name, bases, methods):
        return type.__new__(cls,name,bases,methods)
    
    def __init__(cls, name, bases, methods):
        super(Fruit,cls).__init__(name, bases, methods)
 
Apple = Fruit('Apple',(),{'isGift':lambda self: True, 'eatMethod':lambda self: 'Pare'})
Orange = Fruit('Orange',(),{'isGift':lambda self: True, 'eatMethod':lambda self: 'Husk'})
Pear = Fruit('Pear',(),{'isGift':lambda self: False, 'eatMethod':lambda self: 'Pare'})
Banana = Fruit('Banana',(),{'isGift':lambda self: False, 'eatMethod':lambda self: 'Husk'})
    
if __name__=='__main__':
       
    print map(lambda f: (f.isGift(),f.eatMethod()),[Apple(),Orange(),Pear(),Banana()])

 
> C:\Python25\python.exe -u "D:\LeonDong\StudyStudio\Python\MixIn\meta.py" 
[(True, 'Pare'), (True, 'Husk'), (False, 'Pare'), (False, 'Husk')]

 
 
¶ÔÓÚMixIn»úÖƵÄʵÏֱȽ϶øÑÔÎÒ¸üÈÏ¿ÉĬ¶µÐÖUliPadÖеÄ×ö·¨
ÎÒµÄÀí½âÊÇPlugInÊÇÖ¸ÔÚʵÀý»¯Ê±¶¯Ì¬Ôö¼Ó·½·¨ºÍÊôÐÔ
±ÈÈçeclipseµÄpluginÖ»Òª¶ªµ½Ö¸¶¨µÄfolderÏÂÖØÆô¶¯Ö®ºó¾Í¿ÉÒÔ±»¼ÓÔØ
MixInָʵÀý»¯ÒÔºóÔÙ¶¯Ì¬µÄÔö¼Ó¶Ôеķ½·¨ºÍÊôÐԵĵ÷ÓÃÈë¿Ú
ÕâÊÇÎÒµÄÀí½âµÄMixIn»úÖƵÄʾÀý£¬»¶Ó­ÅÄש£º
 
#!/usr/bin/env python
#
# Copyright(c) 2007 Leon Dong
# E-mail : Leon.Dong在gmail.com
#
 
__mixinset__ = {}
 
class Fruit(object):
    
    __mixinname__ = ''
    
    def __init__(self):
        if __mixinset__.has_key(self.__mixinname__):
            plugins,mixins = __mixinset__[self.__mixinname__]
            setattr(self.__class__,'__plugins__',plugins)
            setattr(self.__class__,'__mixins__',mixins)
        self.initMixIn()
        self.execPlugIn()
    
    def initMixIn(self):
        for key,value in self.__mixins__.items():
            setattr(self.__class__,key,value)
    
    def execPlugIn(self):
        for key,value in self.__plugins__.items():
            setattr(self.__class__,key,value)
            try:
                getattr(self,key)()
            except SystemExit:
                raise
            
    def execMixIn(self, name, *args, **kwargs):
        try:
            f = getattr(self,name)
            f(args[0])
        except SystemExit:
            raise
        
class Apple(Fruit):
    __mixinname__ = 'Apple'
    
class Orange(Fruit):
    __mixinname__ = 'Orange'
 
class Pear(Fruit):
    __mixinname__ = 'Pear'
    
class Banana(Fruit):
    __mixinname__ = 'Banana'
    
def isGift(self):
    self.isGift = True
    print self.isGift
 
def notGift(self):
    self.isGift = False
    print self.isGift
    
def eatMethod(self,m):
    print m
    return m
 
if __name__ == '__main__':
 
    __mixinset__ = {'Apple':({'isGift':isGift},{'eatMethod':eatMethod}),
                    'Orange':({'isGift':isGift},{'eatMethod':eatMethod}),
                    'Pear':({'notGift':notGift},{'eatMethod':eatMethod}),
                    'Banana':({'notGift':notGift},{'eatMethod':eatMethod}),
                    }
 
    apple = Apple()
    orange = Orange()
    pear = Pear()
    banana = Banana()
    
    apple.execMixIn('eatMethod','Pare')
    orange.execMixIn('eatMethod','Husk')
    pear.execMixIn('eatMethod','Pare')
    banana.execMixIn('eatMethod','Husk')
    
    
> C:\Python25\python.exe -u "D:\LeonDong\StudyStudio\Python\MixIn\minin.py" 
True
True
False
False
Pare
Husk
Pare
Husk
 
 

-----Original Message-----
From: python-cn在googlegroups.com [mailto:python-cn在googlegroups.com]On Behalf Of lai yonghao
Sent: Monday, June 18, 2007 12:04 PM
To: python-chinese在lists.python.cn
Cc: python-cn在googlegroups.com
Subject: [SPAM] [CPyUG:27969] Mixin ɨä°à
Importance: Low



Mixin ɨä°à
˵( http://blog.csdn.net/lanphaday)

ÉùÃ÷£º±¾ÎÄÊʺϳõÖм¶Python³ÌÐòÔ±ÔĶÁ£¬ÁíÍâ±¾ÎÄ´ë´Ê¿ÉÄܻᵼÖÂÔĶÁÕß²»ÊÊ£¬¾´ÇëPG¡£

Òý×Ó
àÅ£¬ÎªÊ²Ã´ÒªÌ¸Mixin°¡£¿
ÒòΪ³öÏÖÁËMixinÕâÑùÒ»¸ö¶«Î÷ѽ£¬¾ÍÏñC++ÉçÇøºÜ¶àÈË̸ÂÛtemplateÒ»Ñù°¡£¬PythonÉçÇøÒ²ºÜ¶à»á̸ÂÛMixinµÄ£¨ÒÔºó»áµÄ£¬ÎûÎû£©£¬ËùÒÔÎÒ¾ÍÀ´´Õ´ÕÈÈÄÖÁË¡£
àÅ£¬ÎªÊ²Ã´ÒªMixinѽ£¿
Õâ¸ö£¬»ù±¾ÉÏÒѾ­ÊÇÎÒÕâƪÎÄÕÂÀïÒª½²µÄ¶«Î÷ÁË£¬ËùÒÔ£¬ÎÒ»áÓñ¾ÎĵĴ󲿷Öƪ·ùÀ´»Ø´ðÄãÕâ¸ö³¬ÓÐÉî¶ÈµÄÎÊÌâ¡£ÏÖÔÚ£¬¾Í¿ªÊ¼°É¡« 
Сʱºò£¬ÎÒ¼Ò¿ª°Ù»õµê£¬µ±È»£¬Ò²¼æӪˮ¹ûÊ߲˰¡¡£
СʱºòµÄÊ£¬×ÜÊÇÌرðÓÐȤ£¬Ò²ÌرðµÄÓÐÒâÒ壬ËùÒÔ½ñÌìÎÒÃǾÍÒÔË®¹ûµê¿ªÊ¼°É¡«
¼ÇµÃ£¬ÒÔÇ°ºÜ¶àÈËÂòË®¹ûµÄʱºò£¬¶¼»áÎÊÎÒÂèÒ»¸öÎÊÌ⣬¾ÍÊǼ۸ñÁËÀ²¡«µ«»¹ÓÐÁ½¸öÎÊÌâÒ²¾­³£Îʵ½Å¶£¬¾ÍÊÇËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈË£¿
àÅ£¬ÄêÇàÈË´ó¶à¶¼²»¶®ÕâЩÀñ½Ú¡£ËÍË®¹ûÒ²ÊǺܽ²Õ×Í·µÄ£¬±ÈÈçÀæºÍÏ㽶һ°ã²»ÓÃÀ´ËÍÈË£¬ÒòΪËüÃÇÒâζ×ÅÀë±ðºÍ½¹ÔêŶ£»¶øÆ»¹ûºÍ½Û×ӾͺÜÊÜ»¶Ó­£¬ÒòΪËüÃÇÒâζ×Åƽ°²ºÍ¼ªÀûŶ¡« 
ÒÔ´ËΪ¿ªÊ¼
ÄÇ£¬Õâ¸úPythonÓÐʲô¹ØϵÂð£¿
µ±È»ÓÐÀ²£¬²»È»ÎÒ³¶ÄÇô¶àƤ¸ÉÂïßÖ£¿ÏÖÔÚ£¬¹ú²úÁèÁèÆá½Óµ½Ò»¸öÈÎÎñ£¬ÒªÇóËûΪһ¸öË®¹ûÁ¬Ëøµê¿ª·¢Ò»Ì×Èí¼þ£»ÏÔÈ»Õâ¸ö²»¹ØÐĹú¼ÆÃñÉúÕâЩ¼¦Ã«ËâƤµÄСʵÄÎä·òÊǸ㲻¶¨ÕâÏî¼è¾ÞÈÎÎñµÄÁË£¬Ëû¾ÍÕÒµ½ÁËÄã¡£
ͨ¹ýµ÷ÑУ¬¿Í»§·¢ÏÖÁ½¼þÊÂʵ£ºÒ»ÊÇÏÖÔÚµÄÄêÇàÈË»¹ÊDz»¶®ËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈËÕâÁ½¸öÎÊÌ⣻¶þÊÇË®¹ûÁ¬ËøµêµÄÓªÒµÔ±100£¥¶¼ÊÇÄêÇàÈË£¬ËûÃÇÖд󲿷ÖÈËÒ²²»¶®¡£ 
ËùÒÔ£¬¿Í»§ÒªÇóÔÚÈí¼þÖбØÐëÌṩһ¸öÕâÑùµÄ¹¦ÄÜ£­£­¿ÉÒÔ²éѯһÖÖË®¹ûÊÇ·ñÊÊÒËËÍÈË¡£
×î³õ£¬Äã¿ÉÄÜÕâÑùÉè¼Æ£º
class Fruit(object):
 pass
°ÑfruitÀà×÷ΪһÇÐË®¹ûµÄ»ùÀ࣬àÅ£¬ÕâÏ൱Ã÷ÖÇ¡£´úÂëÖÐÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬Èç¼Û¸ñ¡¢²úµØµÈ¡£
ÏÖÔÚÄã´òËãʵÏÖ×îÊܹ˿ͻ¶Ó­µÄÆ»¹û£º
class Apple(Fruit):
 def is_gift_fruit(self):
  return True
ͬÑùµÄ£¬ÎÒÓÖÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬²¢ÇÒ´òËãÔÚ½ÓÏÂÀ´µÄÐÐÎÄÖв»ÔÙÌáÐÑÕâÒ»µã¡£
AppleÊÇÒ»ÖÖFruit¡£ËùÒÔÉÏÃæµÄʵÏÖͦ·ûºÏOOµÄÔ­Ôò¡£
½ÓÏÂÀ´ÈÃÎÒÃÇʵÏÖÀæ×Ó°É£º
class Pear(Fruit):
 def is_gift_fruit(self):
  return False
½â¾öÎÊÌâÁË¡£Èç¹ûË®¹ûÁ¬ËøµêÖ»ÂôÆ»¹ûºÍÀæ×ÓÁ½ÖÖË®¹ûµÄ»°¡£
¿Éϧ£¬ÐèÇóºÜ¶à£¬Ä㻹ҪʵÏÖ½Û×ÓºÍÏ㽶ÄØ¡£ÄãдÏÂÁËÕ⼸ÐдúÂ룺 
class Orange(Fruit):
 def is_gift_fruit(self):
  return True
class Banana(Fruit):
 def is_gift_fruit(self):
  return False
ºÃ³ô°¡£¬´úÂëµÄ»µÎ¶µÀ£¡
ÀàAppleºÍÀàOrange³ýÁËÀàÃû²»Í¬£¬¼¸ºõÊÇÍêÈ«Öظ´µÄ´úÂ룻ÀàPearºÍÀàBananaÒ²ÊÇÒ»Ñù¡£
¸ü½øÒ»²ãµÄ˵£¬ÕâËĸöÀ඼²î²»¶à°¡£¬ËùÒÔÎÒÃÇÓбØÒªÖع¹Ò»ÏÂÒÑÓдúÂ룬¸ÄÉÆËüÃǵÄÉè¼Æ¡£ 
¸ÄÉÆÒÑÓдúÂë
ÔĶÁ´úÂ룬Äã¿ÉÒÔ·¢ÏÖË®¹ûÖ»·ÖÁ½ÀࣺһÀàÊÇ¿ÉÒÔ×÷ΪÀñÆ·µÄ£¬Ò»ÀàÊDz»¿ÉÒԵġ£ËùÒÔÏ£Íû¿ÉÒÔÕâÑùÉè¼Æ£º
  Fruit
  / \
 GiftFruit NotGiftFruit
 / \ / \
Apple    Orange Pear Banana
àÅ£¬¼ÓÁËÁ½¸öÖмäÀ࣬¿´ÆðÀ´²»´í£º
class GiftFruit(Fruit):
 def is_gift_fruit(self): 
  return True
class NotGiftFruit(Fruit):
 def is_gift_fruit(self):
  return False
class Apple(GiftFruit):pass
class Orange(GiftFruit):pass
class Pear(NotGiftFruit):pass
class Banana(NotGiftFruit):pass 
ºÃÀ²£¬¿´ÉÏÈ¥ºÜ²»´íŶ£¬´úÂ뾫¼òÁ˲»ÉÙ£¬ÈÎÎñÍê³É¡«
еķ³ÄÕ
½ÓÏÂÀ´ÎÒÃÇÀ´Íê³ÉÁíÒ»ÏÄÜ£ºÌṩˮ¹ûʳÓ÷½·¨×Éѯ¡£
²»ÒªÐ¦Õâ¸öÐèÇó£¬ÕâÊÇÕæʵµÄÊг¡ÐèÇó¡£±ÈÈçÏ൱²¿·ÖÒ»±²×ÓÉú»îÔÚ±±·½µÄÅóÓѾÍûÓгԹýÁúÑÛÀóÖ¦Ï㽶£»¶øÄÏ·½ËäȻˮ¹û·á¸»£¬µ«²»ÖªµÀɽÖñÁñÁ«µÈÑóË®¹ûµÄÒ²´óÓÐÈËÔÚ¡£ÎÒÃÇÕâ¸öË®¹ûÁ¬ËøµêÒµÎñ¼òµ¥£¬Ë®¹ûµÄʳÓ÷½·¨Ò²Ö»·ÖÁ½ÖÖ£ºÒ»ÖÖÊÇ°þƤµÄ£¬Èç½Û×ÓºÍÏ㽶£»ÁíÒ»ÖÖÊÇÏ÷ƤµÄ£¬ÈçÆ»¹ûºÍÀæ×Ó¡£ÈÃÎÒÃÇÐÞ¸ÄÔ­ÓеÄÉè¼Æ£º 
   Fruit
   / \
  GiftFruit NotGiftFruit
  / \ /  \
 PareG...   HuskG... PareNot... HuskNot...
 /  / /  / 
Apple     Orange  Pear  Banana
²»µÃÒÑ£¬ÎÒÃÇÌí¼ÓÁËËĸöÀࣺ
class PareGiftFruit(GiftFruit):
 def eat_method(self): 
  return 'Pare'
class HustGiftFruit(GiftFruit):
 def eat_method(self):
  return 'Husk'
class PareNotGiftFruit(NotGiftFruit):
 def eat_method(self):
  return 'Pare'
class HuskNotGiftFruit(NotGiftFruit): 
 def eat_method(self):
  return 'Husk'
ÔõôÕâËĸöÀàÕâôÏñ°¡£¿º¹¡£¡£¡£¡£
ÏÈÈÌÈÌ£¬°ÑAOPBËÄÖÖË®¹ûµÄʵÏָĸģº
class Apple(PareGiftFruit):pass
class Orange(HuskGiftFruit):pass
class Pear(PareNotGiftFruit):Pass
class Banana(HuskNotGiftFruit):pass 
ÎÒÒѾ­ÈÌÎÞ¿ÉÈÌÁË¡£Õâ¸öÉè¼Æ²»½ö½öÓÖÒýÈëÁ˺ò»ÈÝÒ×Ïû³ýµÄÖظ´´úÂ룬¶øÇÒ»¹ÐÞ¸ÄÁËAOPBÕâËĸöÀàµÄʵÏÖ¡£ÕâÖÖÉè¼ÆµÄÀ©Õ¹ÐÔÒ²²»ºÃ£¬Èç¹ûÒÔºóÒªÌṩˮ¹ûµÄÆäËüÌص㣬±ÈÈçÊǽø¿ÚË®¹û»¹Êǹú²úË®¹û¡£Ìì°¡£¬Õ⻹Á˵㡼ÓÉÏÕâ¸öÌØÐÔ£¬ÎÒҪʵÏÖNativePareGiftFruit¡¢NativeHuskGiftFruitµÈÀ๲8¸ö£¨2µÄÈý´Î·½£©°¡¡£Ë®¹ûµÄÌØÕ÷¶àµÃºÜ£¬Ëæ±ãËãËã¿ÉÄܳ¬¹ý16ÖÖ°¡£¬65536¸öÀࣿ½ÐÎÒÈ¥ËÀ°É¡«µ¥Êdz¤´ï16¸öµ¥´ÊµÄÀàÃûÎҾͱÀÀ£ÁË£¡ 
ÏÖÔÚ£¬ÄãÃǶ¼Ó¦¸ÃÒâʶµ½ÕâÖÖʵÏÖ·½·¨ÊµÔÚÊÇÒ»ÖÖö»öºµÄÉè¼ÆÁË¡£ÄÇ£¬ÎÒÃÇÓ¦¸ÃÔõôÑùÉè¼ÆÄØ£¿
PythonicµÄ·½°¸
¸ÃÊÇMixin³ö³¡µÄʱºòÁË£¡
ÏÈÀ´¿´¿´MixinµÄʵÏÖ°É£º
class Fruit(object):
 pass
class GiftMixin(object):
 def is_gift_fruit(self): 
  return True
class NotGiftMixin(object):
 def is_gift_fruit(self):
  return False
class PareMixin(object):
 def eat_method(self):
  return 'Pare'
class HuskMixin(object):
 def eat_method(self): 
  return 'Husk'
class Apple(GiftMixin, PareMixin, Fruit):pass
class Orange(GiftMixin, HuskMixin, Fruit):pass
class Pear(NotGiftMixin, PareMixin, Fruit):pass
class Banana(NotGiftMixin, HuskMixin, Fruit):pass 
±àÂëÍê³É£¡Õâ¾ÍÊÇMixin£¬¾ÍÊÇÕâô¼òµ¥£¬ÒÔÖÂÎÒÎÞ·¨ÔÙ˵³öÈκÎÑÔÓÒòΪÎÒ¾õµÃÉÏÃæµÄ´úÂëÒѾ­ÍêÕûµØ±í´ïÁËÎÒÏëÒª±í´ïµÄ˼Ïë¡£
×¢Òâ, ÒòΪ Python ÀïÃæ¶àÖؼ̳ÐʱÈç¹û±»µ÷ÓõijÉÔ±º¯ÊýÖ»´æÔÚÓÚ¸¸ÀàÖУ¬Ôò°´ÀàÉùÃ÷µÄ¸¸Àà´Ó×óµ½ÓÒ²éÕÒµ÷ÓõÄ, ËùÒÔÖ÷Àà±»·ÅÔÚÓÒ±ß, MixIn ±»·ÅÔÚ×ó±ß£¬²ÅÄÜÕýÈ·µØµ÷Óõ½MixinµÄ³ÉÔ±º¯Êý¡£
MixinµÄºÃ´¦ÊÇ¿ÉÒÔΪÖ÷ÀࣨÈçFruit£©Ìí¼ÓÈÎÒâ¶àµÄMixinÀ´ÊµÏÖ¶à̬£¬±ÈÈç¸Õ²Å˵µÄË®¹ûÓнø¿ÚºÍ¹ú²úÁ½¸öÌØÕ÷£¬ÏÖÔÚÏ൱ÈÝÒ×ʵÏÖ£º 
class NativeMixin(object):
 def Locality(self):
  return 'Native'
class ForeignMixin(object):
 def Locality(self):
  return 'Foreign'
class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #½ø¿Úºì¸»Ê¿ 
class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
¼òµ¥¶àÁË£¬Ö»¼ÓÁËÁ½¸öÀ࣬¶ÔAOPBµÄʵÏÖÒ²Ö»ÊÇÔö¼ÓÁËÒ»¸ö»ùÀࣨÔö¼Ó×ÜÊÇʤ¹ýÐ޸ģ©¡£ 
ÀûÓÃMixinÎÒÃÇ»¹¿ÉÒÔÔö¼ÓÎÞÊý×ÜÌØÕ÷£¬¶øÎÞÐè¶ÔÒÑÓдúÂë×÷Ì«´ó¸Ä¶¯¡£
ÁíÍ⣬ÎÒÃÇ»¹»ñµÃÁË¿ÉÖØÓÃÐÔ¡£±ÈÈçNativeMixinºÍForeignMixin¸úÖ÷ÀàHuman½áºÏ£¬¿ÉÒÔ×ö³ö¹úÈ˺ÍÀÏÍâÁ½¸öÀàŶ¡«Ò²ÐíË®¹ûÁ¬ËøµêÈí¼þÒÔºó»á¿¼ÂǼǼ¹ØÓÚ¿Í»§ÊÇ·ñÍâ¹úÈ˵ÄÐÅÏ¢ÄØ¡£
³ý´ËÖ®Íâ
Õâʱºò£¬Äã¿ÉÄÜ»á˵£ºË®¹ûÁ¬ËøµêÈí¼þÖ»ÊÇÄã¶Å׫µÄÒ»¸öÏîÄ¿£¬MixinÓÐʲôʵ¼ÊÓô¦Â𣿵±È»ÓÐÀ²£¡ÆäʵMixin²¢²»ÊÇʲô¸ß½×µÄPython¼¼ÇÉ£¬ÔçÓоͺܶ࿪ԴÏîĿʹÓÃÕâ¸ö¼¼ÇÉÁË£¬µäÐ͵ģ¬±ÈÈçPythonÏîÄ¿°¡£¡ÔÚPython×Ô´øµÄSocketServer.pyÀï¾ÍÓ¦ÓÃÁËMixinÀ´ÊµÏÖ»ùÓÚ½ø³ÌºÍ»ùÓÚÏ̵߳ÄÁ½ÖÖTCP/UDP·þÎñÄ£ÐÍ£¬ÔÚTkinterºÍPythonµÄÆäËüÄ£¿éÒ²¿ÉÒÔ¼ûµ½ËüµÄ×Ù¼££¬Èç¹ûÄãÁôÒâµÄ»°¡£
# SocketServer.py ÀïµÄMixin
class ForkingUDPServer(ForkingMixIn, UDPServer): pass
class ForkingTCPServer(ForkingMixIn, TCPServer): pass 
class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
È·ÇÐÀ´Ëµ£¬ÎÒ¶ÔMixinÀ´ÊµÏÖµÄË®¹ûÁ¬ËøµêµÄʵÏÖÈÔÈ»Ï൱²»ÂúÒ⣬µ«Èç¹ûÎÒÃÇÏëÒª×ã¹»ÃæÏò¶ÔÏó£¬Ò²¾Í»ù±¾ÉÏÖ»ÄܽÓÊÜÈç´Ë½â¾ö·½°¸ÁË¡£Èç¹ûÓÐÒ»ÌìÄã²»ÄÜÈÌÊÜÿÔö¼ÓÒ»ÖÖÌØÕ÷Äã¾Í±ØÐë±àдN£¨N>=2£©¸öMixin£¬È»ºó¶¼±ØÐë¸øÒѾ­´æÔÚµÄAOPB´úÂëÔö¼ÓÒ»¸ö»ùÀࣨÏëÏ룬ˮ¹ûµêÂôµÄ¿É²»Ö¹ËÄÖÖË®¹û£¬Äã»á¸üÍ·´ó£©£¬ÄÇ£¬¾Í¿¼ÂÇ°ÑOOÅ×Æú°É£¡ 
Ãùл
ÔÚ±¾ÎijÉÎĹý³ÌÖУ¬ÉòáË( http://eishn.blog.163.com <http://eishn.blog.163.com/> )¸øÎҺܴó°ïÖú£¬ÌØ´ËÃùл¡£


--~--~---------~--~----~------------~-------~--~----~
'''ÓʼþÀ´×ÔGroups "python-cn"--China Py User Group 
ÏêÇé: http://groups-beta.google.com/group/python-cn 
·¢ÑÔ: python-cn在googlegroups.com 
Í˶©: python-cn-unsubscribe在googlegroups.com 
ά»ù: http://wiki.woodpecker.org.cn/moin/CPUG 
ͬÀàÁбí: http://python.cn/mailman/listinfo/python-chinese 
ÉçÇøÊÂÎñ: http://groups.google.com/group/CPUG 
±±¾©ÊÂÎñ: http://groups.google.com/group/bpug 
¶«ÄÏÊÂÎñ: http://groups.google.com/group/cpug-eastchina 
''' 
-~----------~----~----~----~------~----~------~--~---



-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070620/7c82c83e/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月20日 星期三 10:30

马宏亮 mhl1983在gmail.com
星期三 六月 20 10:30:43 HKT 2007

àÅ£¬Õâ¸ö˵µÄ²»´í£¬Èç¹ûÖ»ÊǶà¼Ì³ÐÊÇÔÚûʲôÒâÒå
¸Ð¾õmixin×÷ÓÃÓеãÏñeclipseÀïµÄIAdaptable

ÔÚ07-6-20£¬Liming_Do <Liming_Do在smics.com> дµÀ£º
>
>  ·Ç³£Åå·þÂ¥Ö÷ÎÞ˽¹±Ï×µÄÎÄÕ£¬ÖªÊ¶·á¸»»îÆÃÐÎÏó£¬ÊÜÒæ·Çdz£¡
> MixInÊÇÔÚÔËÐÐÆÚ½«·½·¨¶¯Ì¬¸³ÓèÒѾ­ÊµÀý»¯µÄ³ÉÔ±
> µ«ÊÇÐÖµÜÈõÈõµÄÈÏΪÕâ¸öÀý×ÓÊǶàÖؼ̳У¬²»ÄܳÆ×÷MixIn
> ¶øÄúµÄ´úÂëÔÚʵÀý»¯µÄʱºòÒѾ­È·¶¨ÁË£¨ÉÁÒ»¸öÏÈ£¬ÃâµÃ±»±â@_@£©
> ²»Ê¹ÓöàÖؼ̳еĻ°£¬ÕâÊÇÎÒ¾õµÃºÃÍæ¶ùµÄд·¨:
>
> #!/usr/bin/env python
> #
> # Copyright(c) 2007 Leon Dong
> # E-mail : Leon.Dong在gmail.com
> #
>
> class Fruit(type):
>
>     def __new__(cls, name, bases, methods):
>         return type.__new__(cls,name,bases,methods)
>
>     def __init__(cls, name, bases, methods):
>         super(Fruit,cls).__init__(name, bases, methods)
>
> Apple = Fruit('Apple',(),{'isGift':lambda self: True, 'eatMethod':lambda
> self: 'Pare'})
> Orange = Fruit('Orange',(),{'isGift':lambda self: True, 'eatMethod':lambda
> self: 'Husk'})
> Pear = Fruit('Pear',(),{'isGift':lambda self: False, 'eatMethod':lambda
> self: 'Pare'})
> Banana = Fruit('Banana',(),{'isGift':lambda self: False,
> 'eatMethod':lambda self: 'Husk'})
>
> if __name__=='__main__':
>
>     print map(lambda f: (f.isGift(),f.eatMethod
> ()),[Apple(),Orange(),Pear(),Banana()])
>
> > C:\Python25\python.exe -u "D:\LeonDong\StudyStudio\Python\MixIn\meta.py"
>
> [(True, 'Pare'), (True, 'Husk'), (False, 'Pare'), (False, 'Husk')]
>
>
> ¶ÔÓÚMixIn»úÖƵÄʵÏֱȽ϶øÑÔÎÒ¸üÈÏ¿ÉĬ¶µÐÖUliPadÖеÄ×ö·¨
> ÎÒµÄÀí½âÊÇPlugInÊÇÖ¸ÔÚʵÀý»¯Ê±¶¯Ì¬Ôö¼Ó·½·¨ºÍÊôÐÔ
> ±ÈÈçeclipseµÄpluginÖ»Òª¶ªµ½Ö¸¶¨µÄfolderÏÂÖØÆô¶¯Ö®ºó¾Í¿ÉÒÔ±»¼ÓÔØ
> MixInָʵÀý»¯ÒÔºóÔÙ¶¯Ì¬µÄÔö¼Ó¶Ôеķ½·¨ºÍÊôÐԵĵ÷ÓÃÈë¿Ú
> ÕâÊÇÎÒµÄÀí½âµÄMixIn»úÖƵÄʾÀý£¬»¶Ó­ÅÄש£º
>
> #!/usr/bin/env python
> #
> # Copyright(c) 2007 Leon Dong
> # E-mail : Leon.Dong在gmail.com
> #
>
> __mixinset__ = {}
>
> class Fruit(object):
>
>     __mixinname__ = ''
>
>     def __init__(self):
>         if __mixinset__.has_key(self.__mixinname__):
>             plugins,mixins = __mixinset__[self.__mixinname__]
>             setattr(self.__class__,'__plugins__',plugins)
>             setattr(self.__class__,'__mixins__',mixins)
>         self.initMixIn()
>         self.execPlugIn()
>
>     def initMixIn(self):
>         for key,value in self.__mixins__.items():
>             setattr(self.__class__,key,value)
>
>     def execPlugIn(self):
>         for key,value in self.__plugins__.items():
>             setattr(self.__class__,key,value)
>             try:
>                 getattr(self,key)()
>             except SystemExit:
>                 raise
>
>     def execMixIn(self, name, *args, **kwargs):
>         try:
>             f = getattr(self,name)
>             f(args[0])
>         except SystemExit:
>             raise
>
> class Apple(Fruit):
>     __mixinname__ = 'Apple'
>
> class Orange(Fruit):
>     __mixinname__ = 'Orange'
>
> class Pear(Fruit):
>     __mixinname__ = 'Pear'
>
> class Banana(Fruit):
>     __mixinname__ = 'Banana'
>
> def isGift(self):
>     self.isGift = True
>     print self.isGift
>
> def notGift(self):
>     self.isGift = False
>     print self.isGift
>
> def eatMethod(self,m):
>     print m
>     return m
>
> if __name__ == '__main__':
>
>     __mixinset__ = {'Apple':({'isGift':isGift},{'eatMethod':eatMethod}),
>                     'Orange':({'isGift':isGift},{'eatMethod':eatMethod}),
>                     'Pear':({'notGift':notGift},{'eatMethod':eatMethod}),
>
> 'Banana':({'notGift':notGift},{'eatMethod':eatMethod}),
>                     }
>
>     apple = Apple()
>     orange = Orange()
>     pear = Pear()
>     banana = Banana()
>
>     apple.execMixIn('eatMethod','Pare')
>     orange.execMixIn('eatMethod','Husk')
>     pear.execMixIn('eatMethod','Pare')
>     banana.execMixIn('eatMethod','Husk')
>
>
> > C:\Python25\python.exe -u
> "D:\LeonDong\StudyStudio\Python\MixIn\minin.py"
> True
> True
> False
> False
> Pare
> Husk
> Pare
> Husk
>
>
>
> -----Original Message-----
> *From:* python-cn在googlegroups.com [mailto:python-cn在googlegroups.com]*On
> Behalf Of *lai yonghao
> *Sent:* Monday, June 18, 2007 12:04 PM
> *To:* python-chinese在lists.python.cn
> *Cc:* python-cn在googlegroups.com
> *Subject:* [SPAM] [CPyUG:27969] Mixin ɨä°à
> *Importance:* Low
>
> Mixin ɨä°à
> ˵(http://blog.csdn.net/lanphaday)
>
> ÉùÃ÷£º±¾ÎÄÊʺϳõÖм¶Python³ÌÐòÔ±ÔĶÁ£¬ÁíÍâ±¾ÎÄ´ë´Ê¿ÉÄܻᵼÖÂÔĶÁÕß²»ÊÊ£¬¾´ÇëPG¡£
>
> *Òý×Ó*
> àÅ£¬ÎªÊ²Ã´ÒªÌ¸Mixin°¡£¿
>
> ÒòΪ³öÏÖÁËMixinÕâÑùÒ»¸ö¶«Î÷ѽ£¬¾ÍÏñC++ÉçÇøºÜ¶àÈË̸ÂÛtemplateÒ»Ñù°¡£¬PythonÉçÇøÒ²ºÜ¶à»á̸ÂÛMixinµÄ£¨ÒÔºó»áµÄ£¬ÎûÎû£©£¬ËùÒÔÎÒ¾ÍÀ´´Õ´ÕÈÈÄÖÁË¡£
> àÅ£¬ÎªÊ²Ã´ÒªMixinѽ£¿
> Õâ¸ö£¬»ù±¾ÉÏÒѾ­ÊÇÎÒÕâƪÎÄÕÂÀïÒª½²µÄ¶«Î÷ÁË£¬ËùÒÔ£¬ÎÒ»áÓñ¾ÎĵĴ󲿷Öƪ·ùÀ´»Ø´ðÄãÕâ¸ö³¬ÓÐÉî¶ÈµÄÎÊÌâ¡£ÏÖÔÚ£¬¾Í¿ªÊ¼°É¡«
> Сʱºò£¬ÎÒ¼Ò¿ª°Ù»õµê£¬µ±È»£¬Ò²¼æӪˮ¹ûÊ߲˰¡¡£
> СʱºòµÄÊ£¬×ÜÊÇÌرðÓÐȤ£¬Ò²ÌرðµÄÓÐÒâÒ壬ËùÒÔ½ñÌìÎÒÃǾÍÒÔË®¹ûµê¿ªÊ¼°É¡«
> ¼ÇµÃ£¬ÒÔÇ°ºÜ¶àÈËÂòË®¹ûµÄʱºò£¬¶¼»áÎÊÎÒÂèÒ»¸öÎÊÌ⣬¾ÍÊǼ۸ñÁËÀ²¡«µ«»¹ÓÐÁ½¸öÎÊÌâÒ²¾­³£Îʵ½Å¶£¬¾ÍÊÇËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈË£¿
> àÅ£¬ÄêÇàÈË´ó¶à¶¼²»¶®ÕâЩÀñ½Ú¡£ËÍË®¹ûÒ²ÊǺܽ²Õ×Í·µÄ£¬±ÈÈçÀæºÍÏ㽶һ°ã²»ÓÃÀ´ËÍÈË£¬ÒòΪËüÃÇÒâζ×ÅÀë±ðºÍ½¹ÔêŶ£»¶øÆ»¹ûºÍ½Û×ӾͺÜÊÜ»¶Ó­£¬ÒòΪËüÃÇÒâζ×Åƽ°²ºÍ¼ªÀûŶ¡«
>
> *ÒÔ´ËΪ¿ªÊ¼*
> ÄÇ£¬Õâ¸úPythonÓÐʲô¹ØϵÂð£¿
>
> µ±È»ÓÐÀ²£¬²»È»ÎÒ³¶ÄÇô¶àƤ¸ÉÂïßÖ£¿ÏÖÔÚ£¬¹ú²úÁèÁèÆá½Óµ½Ò»¸öÈÎÎñ£¬ÒªÇóËûΪһ¸öË®¹ûÁ¬Ëøµê¿ª·¢Ò»Ì×Èí¼þ£»ÏÔÈ»Õâ¸ö²»¹ØÐĹú¼ÆÃñÉúÕâЩ¼¦Ã«ËâƤµÄСʵÄÎä·òÊǸ㲻¶¨ÕâÏî¼è¾ÞÈÎÎñµÄÁË£¬Ëû¾ÍÕÒµ½ÁËÄã¡£
> ͨ¹ýµ÷ÑУ¬¿Í»§·¢ÏÖÁ½¼þÊÂʵ£ºÒ»ÊÇÏÖÔÚµÄÄêÇàÈË»¹ÊDz»¶®ËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈËÕâÁ½¸öÎÊÌ⣻¶þÊÇË®¹ûÁ¬ËøµêµÄÓªÒµÔ±100£¥¶¼ÊÇÄêÇàÈË£¬ËûÃÇÖд󲿷ÖÈËÒ²²»¶®¡£
>
> ËùÒÔ£¬¿Í»§ÒªÇóÔÚÈí¼þÖбØÐëÌṩһ¸öÕâÑùµÄ¹¦ÄÜ£­£­¿ÉÒÔ²éѯһÖÖË®¹ûÊÇ·ñÊÊÒËËÍÈË¡£
> ×î³õ£¬Äã¿ÉÄÜÕâÑùÉè¼Æ£º
> class Fruit(object):
>  pass
> °ÑfruitÀà×÷ΪһÇÐË®¹ûµÄ»ùÀ࣬àÅ£¬ÕâÏ൱Ã÷ÖÇ¡£´úÂëÖÐÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬Èç¼Û¸ñ¡¢²úµØµÈ¡£
> ÏÖÔÚÄã´òËãʵÏÖ×îÊܹ˿ͻ¶Ó­µÄÆ»¹û£º
> class Apple(Fruit):
>  def is_gift_fruit(self):
>   return True
> ͬÑùµÄ£¬ÎÒÓÖÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬²¢ÇÒ´òËãÔÚ½ÓÏÂÀ´µÄÐÐÎÄÖв»ÔÙÌáÐÑÕâÒ»µã¡£
> AppleÊÇÒ»ÖÖFruit¡£ËùÒÔÉÏÃæµÄʵÏÖͦ·ûºÏOOµÄÔ­Ôò¡£
> ½ÓÏÂÀ´ÈÃÎÒÃÇʵÏÖÀæ×Ó°É£º
> class Pear(Fruit):
>  def is_gift_fruit(self):
>   return False
> ½â¾öÎÊÌâÁË¡£Èç¹ûË®¹ûÁ¬ËøµêÖ»ÂôÆ»¹ûºÍÀæ×ÓÁ½ÖÖË®¹ûµÄ»°¡£
> ¿Éϧ£¬ÐèÇóºÜ¶à£¬Ä㻹ҪʵÏÖ½Û×ÓºÍÏ㽶ÄØ¡£ÄãдÏÂÁËÕ⼸ÐдúÂ룺
> class Orange(Fruit):
>  def is_gift_fruit(self):
>   return True
> class Banana(Fruit):
>  def is_gift_fruit(self):
>   return False
> ºÃ³ô°¡£¬´úÂëµÄ»µÎ¶µÀ£¡
> ÀàAppleºÍÀàOrange³ýÁËÀàÃû²»Í¬£¬¼¸ºõÊÇÍêÈ«Öظ´µÄ´úÂ룻ÀàPearºÍÀàBananaÒ²ÊÇÒ»Ñù¡£
> ¸ü½øÒ»²ãµÄ˵£¬ÕâËĸöÀ඼²î²»¶à°¡£¬ËùÒÔÎÒÃÇÓбØÒªÖع¹Ò»ÏÂÒÑÓдúÂ룬¸ÄÉÆËüÃǵÄÉè¼Æ¡£
> ¸ÄÉÆÒÑÓдúÂë
> ÔĶÁ´úÂ룬Äã¿ÉÒÔ·¢ÏÖË®¹ûÖ»·ÖÁ½ÀࣺһÀàÊÇ¿ÉÒÔ×÷ΪÀñÆ·µÄ£¬Ò»ÀàÊDz»¿ÉÒԵġ£ËùÒÔÏ£Íû¿ÉÒÔÕâÑùÉè¼Æ£º
>   Fruit
>   / \
>  GiftFruit NotGiftFruit
>  / \ / \
> Apple    Orange Pear Banana
> àÅ£¬¼ÓÁËÁ½¸öÖмäÀ࣬¿´ÆðÀ´²»´í£º
> class GiftFruit(Fruit):
>  def is_gift_fruit(self):
>   return True
> class NotGiftFruit(Fruit):
>  def is_gift_fruit(self):
>   return False
> class Apple(GiftFruit):pass
> class Orange(GiftFruit):pass
> class Pear(NotGiftFruit):pass
> class Banana(NotGiftFruit):pass
> ºÃÀ²£¬¿´ÉÏÈ¥ºÜ²»´íŶ£¬´úÂ뾫¼òÁ˲»ÉÙ£¬ÈÎÎñÍê³É¡«
> *еķ³ÄÕ*
> ½ÓÏÂÀ´ÎÒÃÇÀ´Íê³ÉÁíÒ»ÏÄÜ£ºÌṩˮ¹ûʳÓ÷½·¨×Éѯ¡£
> ²»ÒªÐ¦Õâ¸öÐèÇó£¬ÕâÊÇÕæʵµÄÊг¡ÐèÇó¡£±ÈÈçÏ൱²¿·ÖÒ»±²×ÓÉú»îÔÚ±±·½µÄÅóÓѾÍûÓгԹýÁúÑÛÀóÖ¦Ï㽶£»¶øÄÏ·½ËäȻˮ¹û·á¸»£¬µ«²»ÖªµÀɽÖñÁñÁ«µÈÑóË®¹ûµÄÒ²´óÓÐÈËÔÚ¡£ÎÒÃÇÕâ¸öË®¹ûÁ¬ËøµêÒµÎñ¼òµ¥£¬Ë®¹ûµÄʳÓ÷½·¨Ò²Ö»·ÖÁ½ÖÖ£ºÒ»ÖÖÊÇ°þƤµÄ£¬Èç½Û×ÓºÍÏ㽶£»ÁíÒ»ÖÖÊÇÏ÷ƤµÄ£¬ÈçÆ»¹ûºÍÀæ×Ó¡£ÈÃÎÒÃÇÐÞ¸ÄÔ­ÓеÄÉè¼Æ£º
>
>    Fruit
>    / \
>   GiftFruit NotGiftFruit
>   / \ /  \
>  PareG...   HuskG... PareNot... HuskNot...
>  /  / /  /
> Apple     Orange  Pear  Banana
> ²»µÃÒÑ£¬ÎÒÃÇÌí¼ÓÁËËĸöÀࣺ
> class PareGiftFruit(GiftFruit):
>  def eat_method(self):
>   return 'Pare'
> class HustGiftFruit(GiftFruit):
>  def eat_method(self):
>   return 'Husk'
> class PareNotGiftFruit(NotGiftFruit):
>  def eat_method(self):
>   return 'Pare'
> class HuskNotGiftFruit(NotGiftFruit):
>  def eat_method(self):
>   return 'Husk'
> ÔõôÕâËĸöÀàÕâôÏñ°¡£¿º¹¡£¡£¡£¡£
> ÏÈÈÌÈÌ£¬°ÑAOPBËÄÖÖË®¹ûµÄʵÏָĸģº
> class Apple(PareGiftFruit):pass
> class Orange(HuskGiftFruit):pass
> class Pear(PareNotGiftFruit):Pass
> class Banana(HuskNotGiftFruit):pass
> ÎÒÒѾ­ÈÌÎÞ¿ÉÈÌÁË¡£Õâ¸öÉè¼Æ²»½ö½öÓÖÒýÈëÁ˺ò»ÈÝÒ×Ïû³ýµÄÖظ´´úÂ룬¶øÇÒ»¹ÐÞ¸ÄÁËAOPBÕâËĸöÀàµÄʵÏÖ¡£ÕâÖÖÉè¼ÆµÄÀ©Õ¹ÐÔÒ²²»ºÃ£¬Èç¹ûÒÔºóÒªÌṩˮ¹ûµÄÆäËüÌص㣬±ÈÈçÊǽø¿ÚË®¹û»¹Êǹú²úË®¹û¡£Ìì°¡£¬Õ⻹Á˵㡼ÓÉÏÕâ¸öÌØÐÔ£¬ÎÒҪʵÏÖNativePareGiftFruit¡¢NativeHuskGiftFruitµÈÀ๲8¸ö£¨2µÄÈý´Î·½£©°¡¡£Ë®¹ûµÄÌØÕ÷¶àµÃºÜ£¬Ëæ±ãËãËã¿ÉÄܳ¬¹ý16ÖÖ°¡£¬65536¸öÀࣿ½ÐÎÒÈ¥ËÀ°É¡«µ¥Êdz¤´ï16¸öµ¥´ÊµÄÀàÃûÎҾͱÀÀ£ÁË£¡
>
> ÏÖÔÚ£¬ÄãÃǶ¼Ó¦¸ÃÒâʶµ½ÕâÖÖʵÏÖ·½·¨ÊµÔÚÊÇÒ»ÖÖö»öºµÄÉè¼ÆÁË¡£ÄÇ£¬ÎÒÃÇÓ¦¸ÃÔõôÑùÉè¼ÆÄØ£¿
> *PythonicµÄ·½°¸*
> ¸ÃÊÇMixin³ö³¡µÄʱºòÁË£¡
> ÏÈÀ´¿´¿´MixinµÄʵÏÖ°É£º
> class Fruit(object):
>  pass
> class GiftMixin(object):
>  def is_gift_fruit(self):
>   return True
> class NotGiftMixin(object):
>  def is_gift_fruit(self):
>   return False
> class PareMixin(object):
>  def eat_method(self):
>   return 'Pare'
> class HuskMixin(object):
>  def eat_method(self):
>   return 'Husk'
> class Apple(GiftMixin, PareMixin, Fruit):pass
> class Orange(GiftMixin, HuskMixin, Fruit):pass
> class Pear(NotGiftMixin, PareMixin, Fruit):pass
> class Banana(NotGiftMixin, HuskMixin, Fruit):pass
> ±àÂëÍê³É£¡Õâ¾ÍÊÇMixin£¬¾ÍÊÇÕâô¼òµ¥£¬ÒÔÖÂÎÒÎÞ·¨ÔÙ˵³öÈκÎÑÔÓÒòΪÎÒ¾õµÃÉÏÃæµÄ´úÂëÒѾ­ÍêÕûµØ±í´ïÁËÎÒÏëÒª±í´ïµÄ˼Ïë¡£
> ×¢Òâ, ÒòΪ Python ÀïÃæ¶àÖؼ̳ÐʱÈç¹û±»µ÷ÓõijÉÔ±º¯ÊýÖ»´æÔÚÓÚ¸¸ÀàÖУ¬Ôò°´ÀàÉùÃ÷µÄ¸¸Àà´Ó×óµ½ÓÒ²éÕÒµ÷ÓõÄ, ËùÒÔÖ÷Àà±»·ÅÔÚÓÒ±ß, MixIn
> ±»·ÅÔÚ×ó±ß£¬²ÅÄÜÕýÈ·µØµ÷Óõ½MixinµÄ³ÉÔ±º¯Êý¡£
> MixinµÄºÃ´¦ÊÇ¿ÉÒÔΪÖ÷ÀࣨÈçFruit£©Ìí¼ÓÈÎÒâ¶àµÄMixinÀ´ÊµÏÖ¶à̬£¬±ÈÈç¸Õ²Å˵µÄË®¹ûÓнø¿ÚºÍ¹ú²úÁ½¸öÌØÕ÷£¬ÏÖÔÚÏ൱ÈÝÒ×ʵÏÖ£º
> class NativeMixin(object):
>  def Locality(self):
>   return 'Native'
> class ForeignMixin(object):
>  def Locality(self):
>   return 'Foreign'
> class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #½ø¿Úºì¸»Ê¿
> class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
> class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
> class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
> ¼òµ¥¶àÁË£¬Ö»¼ÓÁËÁ½¸öÀ࣬¶ÔAOPBµÄʵÏÖÒ²Ö»ÊÇÔö¼ÓÁËÒ»¸ö»ùÀࣨÔö¼Ó×ÜÊÇʤ¹ýÐ޸ģ©¡£
> ÀûÓÃMixinÎÒÃÇ»¹¿ÉÒÔÔö¼ÓÎÞÊý×ÜÌØÕ÷£¬¶øÎÞÐè¶ÔÒÑÓдúÂë×÷Ì«´ó¸Ä¶¯¡£
>
> ÁíÍ⣬ÎÒÃÇ»¹»ñµÃÁË¿ÉÖØÓÃÐÔ¡£±ÈÈçNativeMixinºÍForeignMixin¸úÖ÷ÀàHuman½áºÏ£¬¿ÉÒÔ×ö³ö¹úÈ˺ÍÀÏÍâÁ½¸öÀàŶ¡«Ò²ÐíË®¹ûÁ¬ËøµêÈí¼þÒÔºó»á¿¼ÂǼǼ¹ØÓÚ¿Í»§ÊÇ·ñÍâ¹úÈ˵ÄÐÅÏ¢ÄØ¡£
> *³ý´ËÖ®Íâ*
>
> Õâʱºò£¬Äã¿ÉÄÜ»á˵£ºË®¹ûÁ¬ËøµêÈí¼þÖ»ÊÇÄã¶Å׫µÄÒ»¸öÏîÄ¿£¬MixinÓÐʲôʵ¼ÊÓô¦Â𣿵±È»ÓÐÀ²£¡ÆäʵMixin²¢²»ÊÇʲô¸ß½×µÄPython¼¼ÇÉ£¬ÔçÓоͺܶ࿪ԴÏîĿʹÓÃÕâ¸ö¼¼ÇÉÁË£¬µäÐ͵ģ¬±ÈÈçPythonÏîÄ¿°¡£¡
> ÔÚPython×Ô´øµÄSocketServer.pyÀï¾ÍÓ¦ÓÃÁËMixinÀ´ÊµÏÖ»ùÓÚ½ø³ÌºÍ»ùÓÚÏ̵߳ÄÁ½ÖÖTCP
> /UDP·þÎñÄ£ÐÍ£¬ÔÚTkinterºÍPythonµÄÆäËüÄ£¿éÒ²¿ÉÒÔ¼ûµ½ËüµÄ×Ù¼££¬Èç¹ûÄãÁôÒâµÄ»°¡£
> # SocketServer.py ÀïµÄMixin
> class ForkingUDPServer(ForkingMixIn, UDPServer): pass
> class ForkingTCPServer(ForkingMixIn, TCPServer): pass
> class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
> class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
> È·ÇÐÀ´Ëµ£¬ÎÒ¶ÔMixinÀ´ÊµÏÖµÄË®¹ûÁ¬ËøµêµÄʵÏÖÈÔÈ»Ï൱²»ÂúÒ⣬µ«Èç¹ûÎÒÃÇÏëÒª×ã¹»ÃæÏò¶ÔÏó£¬Ò²¾Í»ù±¾ÉÏÖ»ÄܽÓÊÜÈç´Ë½â¾ö·½°¸ÁË¡£Èç¹ûÓÐÒ»ÌìÄã²»ÄÜÈÌÊÜÿÔö¼ÓÒ»ÖÖÌØÕ÷Äã¾Í±ØÐë±àдN£¨N>=2£©¸öMixin£¬È»ºó¶¼±ØÐë¸øÒѾ­´æÔÚµÄAOPB´úÂëÔö¼ÓÒ»¸ö»ùÀࣨÏëÏ룬ˮ¹ûµêÂôµÄ¿É²»Ö¹ËÄÖÖË®¹û£¬Äã»á¸üÍ·´ó£©£¬ÄÇ£¬¾Í¿¼ÂÇ°ÑOOÅ×Æú°É£¡
>
> *Ãùл*
> ÔÚ±¾ÎijÉÎĹý³ÌÖУ¬ÉòáË(http://eishn.blog.163.com)¸øÎҺܴó°ïÖú£¬ÌØ´ËÃùл¡£
>
> --~--~---------~--~----~------------~-------~--~----~
> '''ÓʼþÀ´×ÔGroups "python-cn"--China Py User Group
> ÏêÇé: http://groups-beta.google.com/group/python-cn
> ·¢ÑÔ: python-cn在googlegroups.com
> Í˶©: python-cn-unsubscribe在googlegroups.com
> ά»ù: http://wiki.woodpecker.org.cn/moin/CPUG
> ͬÀàÁбí: http://python.cn/mailman/listinfo/python-chinese
> ÉçÇøÊÂÎñ: http://groups.google.com/group/CPUG
> ±±¾©ÊÂÎñ: http://groups.google.com/group/bpug
> ¶«ÄÏÊÂÎñ: http://groups.google.com/group/cpug-eastchina
> '''
> -~----------~----~----~----~------~----~------~--~---
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
ÂíºêÁÁ
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070620/3ef276ee/attachment-0001.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月20日 星期三 10:35

limodou limodou在gmail.com
星期三 六月 20 10:35:36 HKT 2007

On 6/20/07, 马宏亮 <mhl1983在gmail.com> wrote:
> 嗯,这个说的不错,如果只是多继承是在没什么意义
> 感觉mixin作用有点像eclipse里的IAdaptable
>
Mixin与Plugin在UliPad中有区别的,Plugin是由一个调用点+实现的函数链构成。调用点需要在源码中设置,它是预知的。但是函数链则是未知的。而Mixin则可以完全未知,它是对原类的属性或方法的扩展或替换。

-- 
I like python!
UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年06月20日 星期三 10:50

Liming_Do Liming_Do在smics.com
星期三 六月 20 10:50:34 HKT 2007

ÓеãÄǸöÒâ˼£¬ÓÚÎÒÐÄÓÐÆÝÆÝÑÉ:)
µÚÒ»¶Î´úÂëÓõÄÔªÀà±à³Ì£¬Fruit²»ÊǼ̳Ð×Ôobject¶øÊǼ̳Ð×Ôtype
Ïà¶ÔÀ´Ëµ¹¦ÄÜÇ¿´ó´úÂë¼òÁ·£¬µ«ÊÇ·½·¨»¹ÊÇÔÚʵÀý»¯µÄʱºòÈ·¶¨ÁË£¬²»ÄܳÆ×÷mixin
ÊǶԶàÖؼ̳еÄÁíÒ»¸ö¶¯Ì¬Ôö¼Ó³ÉÔ±µÄʵÏÖ·½·¨
µÚ¶þ¶Î´úÂë¿ÉÒÔÔÙдеķ½·¨£¬¼Óµ½__mixinset__ÖоͿÉÒÔµ÷ÓÃ
ËùÒÔÕâ²ÅÊÇÎÒÀí½âµÄÄܹ»Ëã×öÊÇmixinµÄ»úÖÆ

-----Original Message-----
From: python-chinese-bounces在lists.python.cn [mailto:python-chinese-bounces在lists.python.cn]On Behalf Of ÂíºêÁÁ
Sent: Wednesday, June 20, 2007 10:31 AM
To: python-chinese在lists.python.cn
Subject: [SPAM] Re: [python-chinese] [SPAM] [CPyUG:27969] Mixin ɨä°à
Importance: Low


àÅ£¬Õâ¸ö˵µÄ²»´í£¬Èç¹ûÖ»ÊǶà¼Ì³ÐÊÇÔÚûʲôÒâÒå
¸Ð¾õmixin×÷ÓÃÓеãÏñeclipseÀïµÄIAdaptable


ÔÚ07-6-20£¬Liming_Do < Liming_Do在smics.com> дµÀ£º 

·Ç³£Åå·þÂ¥Ö÷ÎÞ˽¹±Ï×µÄÎÄÕ£¬ÖªÊ¶·á¸»»îÆÃÐÎÏó£¬ÊÜÒæ·Çdz£¡
MixInÊÇÔÚÔËÐÐÆÚ½«·½·¨¶¯Ì¬¸³ÓèÒѾ­ÊµÀý»¯µÄ³ÉÔ±
µ«ÊÇÐÖµÜÈõÈõµÄÈÏΪÕâ¸öÀý×ÓÊǶàÖؼ̳У¬²»ÄܳÆ×÷MixIn
¶øÄúµÄ´úÂëÔÚʵÀý»¯µÄʱºòÒѾ­È·¶¨ÁË£¨ÉÁÒ»¸öÏÈ£¬ÃâµÃ±»±â@_@£©
²»Ê¹ÓöàÖؼ̳еĻ°£¬ÕâÊÇÎÒ¾õµÃºÃÍæ¶ùµÄд·¨:
 
#!/usr/bin/env python
#
# Copyright(c) 2007 Leon Dong
# E-mail : Leon.Dong在gmail.com
#
 
class Fruit(type):
    
    def __new__(cls, name, bases, methods):
        return type.__new__(cls,name,bases,methods)
    
    def __init__(cls, name, bases, methods):
        super(Fruit,cls).__init__(name, bases, methods)
 
Apple = Fruit('Apple',(),{'isGift':lambda self: True, 'eatMethod':lambda self: 'Pare'})
Orange = Fruit('Orange',(),{'isGift':lambda self: True, 'eatMethod':lambda self: 'Husk'})
Pear = Fruit('Pear',(),{'isGift':lambda self: False, 'eatMethod':lambda self: 'Pare'})
Banana = Fruit('Banana',(),{'isGift':lambda self: False, 'eatMethod':lambda self: 'Husk'})
    
if __name__=='__main__':
       
    print map(lambda f: (f.isGift(),f.eatMethod()),[Apple(),Orange(),Pear(),Banana()])

 
> C:\Python25\python.exe -u "D:\LeonDong\StudyStudio\Python\MixIn\meta.py" 
[(True, 'Pare'), (True, 'Husk'), (False, 'Pare'), (False, 'Husk')]

 
 
¶ÔÓÚMixIn»úÖƵÄʵÏֱȽ϶øÑÔÎÒ¸üÈÏ¿ÉĬ¶µÐÖUliPadÖеÄ×ö·¨
ÎÒµÄÀí½âÊÇPlugInÊÇÖ¸ÔÚʵÀý»¯Ê±¶¯Ì¬Ôö¼Ó·½·¨ºÍÊôÐÔ
±ÈÈçeclipseµÄpluginÖ»Òª¶ªµ½Ö¸¶¨µÄfolderÏÂÖØÆô¶¯Ö®ºó¾Í¿ÉÒÔ±»¼ÓÔØ
MixInָʵÀý»¯ÒÔºóÔÙ¶¯Ì¬µÄÔö¼Ó¶Ôеķ½·¨ºÍÊôÐԵĵ÷ÓÃÈë¿Ú
ÕâÊÇÎÒµÄÀí½âµÄMixIn»úÖƵÄʾÀý£¬»¶Ó­ÅÄש£º
 
#!/usr/bin/env python
#
# Copyright(c) 2007 Leon Dong
# E-mail : Leon.Dong在gmail.com
#
 
__mixinset__ = {}
 
class Fruit(object):
    
    __mixinname__ = ''
    
    def __init__(self):
        if __mixinset__.has_key(self.__mixinname__):
            plugins,mixins = __mixinset__[self.__mixinname__]
            setattr(self.__class__,'__plugins__',plugins)
            setattr(self.__class__,'__mixins__',mixins)
        self.initMixIn()
        self.execPlugIn()
    
    def initMixIn(self):
        for key,value in self.__mixins__.items():
            setattr(self.__class__,key,value)
    
    def execPlugIn(self):
        for key,value in self.__plugins__.items():
            setattr(self.__class__,key,value)
            try:
                getattr(self,key)()
            except SystemExit:
                raise
            
    def execMixIn(self, name, *args, **kwargs):
        try:
            f = getattr(self,name)
            f(args[0])
        except SystemExit:
            raise
        
class Apple(Fruit):
    __mixinname__ = 'Apple'
    
class Orange(Fruit):
    __mixinname__ = 'Orange'
 
class Pear(Fruit):
    __mixinname__ = 'Pear'
    
class Banana(Fruit):
    __mixinname__ = 'Banana'
    
def isGift(self):
    self.isGift = True
    print self.isGift
 
def notGift(self):
    self.isGift = False
    print self.isGift
    
def eatMethod(self,m):
    print m
    return m
 
if __name__ == '__main__':
 
    __mixinset__ = {'Apple':({'isGift':isGift},{'eatMethod':eatMethod}),
                    'Orange':({'isGift':isGift},{'eatMethod':eatMethod}),
                    'Pear':({'notGift':notGift},{'eatMethod':eatMethod}),
                    'Banana':({'notGift':notGift},{'eatMethod':eatMethod}),
                    }
 
    apple = Apple()
    orange = Orange()
    pear = Pear()
    banana = Banana()
    
    apple.execMixIn('eatMethod','Pare')
    orange.execMixIn('eatMethod','Husk')
    pear.execMixIn('eatMethod','Pare')
    banana.execMixIn('eatMethod','Husk')
    
    
> C:\Python25\python.exe -u "D:\LeonDong\StudyStudio\Python\MixIn\minin.py" 
True
True
False
False
Pare
Husk
Pare
Husk
 
 


-----Original Message-----
From: python-cn在googlegroups.com  python-cn在googlegroups.com> [mailto: python-cn在googlegroups.com]On Behalf Of lai yonghao
Sent: Monday, June 18, 2007 12:04 PM
To: python-chinese在lists.python.cn
Cc: python-cn在googlegroups.com
Subject: [SPAM] [CPyUG:27969] Mixin ɨä°à
Importance: Low



Mixin ɨä°à
˵( http://blog.csdn.net/lanphaday)

ÉùÃ÷£º±¾ÎÄÊʺϳõÖм¶Python³ÌÐòÔ±ÔĶÁ£¬ÁíÍâ±¾ÎÄ´ë´Ê¿ÉÄܻᵼÖÂÔĶÁÕß²»ÊÊ£¬¾´ÇëPG¡£

Òý×Ó
àÅ£¬ÎªÊ²Ã´ÒªÌ¸Mixin°¡£¿
ÒòΪ³öÏÖÁËMixinÕâÑùÒ»¸ö¶«Î÷ѽ£¬¾ÍÏñC++ÉçÇøºÜ¶àÈË̸ÂÛtemplateÒ»Ñù°¡£¬PythonÉçÇøÒ²ºÜ¶à»á̸ÂÛMixinµÄ£¨ÒÔºó»áµÄ£¬ÎûÎû£©£¬ËùÒÔÎÒ¾ÍÀ´´Õ´ÕÈÈÄÖÁË¡£
àÅ£¬ÎªÊ²Ã´ÒªMixinѽ£¿
Õâ¸ö£¬»ù±¾ÉÏÒѾ­ÊÇÎÒÕâƪÎÄÕÂÀïÒª½²µÄ¶«Î÷ÁË£¬ËùÒÔ£¬ÎÒ»áÓñ¾ÎĵĴ󲿷Öƪ·ùÀ´»Ø´ðÄãÕâ¸ö³¬ÓÐÉî¶ÈµÄÎÊÌâ¡£ÏÖÔÚ£¬¾Í¿ªÊ¼°É¡« 
Сʱºò£¬ÎÒ¼Ò¿ª°Ù»õµê£¬µ±È»£¬Ò²¼æӪˮ¹ûÊ߲˰¡¡£
СʱºòµÄÊ£¬×ÜÊÇÌرðÓÐȤ£¬Ò²ÌرðµÄÓÐÒâÒ壬ËùÒÔ½ñÌìÎÒÃǾÍÒÔË®¹ûµê¿ªÊ¼°É¡«
¼ÇµÃ£¬ÒÔÇ°ºÜ¶àÈËÂòË®¹ûµÄʱºò£¬¶¼»áÎÊÎÒÂèÒ»¸öÎÊÌ⣬¾ÍÊǼ۸ñÁËÀ²¡«µ«»¹ÓÐÁ½¸öÎÊÌâÒ²¾­³£Îʵ½Å¶£¬¾ÍÊÇËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈË£¿
àÅ£¬ÄêÇàÈË´ó¶à¶¼²»¶®ÕâЩÀñ½Ú¡£ËÍË®¹ûÒ²ÊǺܽ²Õ×Í·µÄ£¬±ÈÈçÀæºÍÏ㽶һ°ã²»ÓÃÀ´ËÍÈË£¬ÒòΪËüÃÇÒâζ×ÅÀë±ðºÍ½¹ÔêŶ£»¶øÆ»¹ûºÍ½Û×ӾͺÜÊÜ»¶Ó­£¬ÒòΪËüÃÇÒâζ×Åƽ°²ºÍ¼ªÀûŶ¡« 
ÒÔ´ËΪ¿ªÊ¼
ÄÇ£¬Õâ¸úPythonÓÐʲô¹ØϵÂð£¿
µ±È»ÓÐÀ²£¬²»È»ÎÒ³¶ÄÇô¶àƤ¸ÉÂïßÖ£¿ÏÖÔÚ£¬¹ú²úÁèÁèÆá½Óµ½Ò»¸öÈÎÎñ£¬ÒªÇóËûΪһ¸öË®¹ûÁ¬Ëøµê¿ª·¢Ò»Ì×Èí¼þ£»ÏÔÈ»Õâ¸ö²»¹ØÐĹú¼ÆÃñÉúÕâЩ¼¦Ã«ËâƤµÄСʵÄÎä·òÊǸ㲻¶¨ÕâÏî¼è¾ÞÈÎÎñµÄÁË£¬Ëû¾ÍÕÒµ½ÁËÄã¡£
ͨ¹ýµ÷ÑУ¬¿Í»§·¢ÏÖÁ½¼þÊÂʵ£ºÒ»ÊÇÏÖÔÚµÄÄêÇàÈË»¹ÊDz»¶®ËÍÈËÓ¦¸ÃÂòʲôˮ¹ûºÍʲôˮ¹û¿ÉÒÔÓÃÀ´ËÍÈËÕâÁ½¸öÎÊÌ⣻¶þÊÇË®¹ûÁ¬ËøµêµÄÓªÒµÔ±100£¥¶¼ÊÇÄêÇàÈË£¬ËûÃÇÖд󲿷ÖÈËÒ²²»¶®¡£ 
ËùÒÔ£¬¿Í»§ÒªÇóÔÚÈí¼þÖбØÐëÌṩһ¸öÕâÑùµÄ¹¦ÄÜ£­£­¿ÉÒÔ²éѯһÖÖË®¹ûÊÇ·ñÊÊÒËËÍÈË¡£
×î³õ£¬Äã¿ÉÄÜÕâÑùÉè¼Æ£º
class Fruit(object):
 pass
°ÑfruitÀà×÷ΪһÇÐË®¹ûµÄ»ùÀ࣬àÅ£¬ÕâÏ൱Ã÷ÖÇ¡£´úÂëÖÐÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬Èç¼Û¸ñ¡¢²úµØµÈ¡£
ÏÖÔÚÄã´òËãʵÏÖ×îÊܹ˿ͻ¶Ó­µÄÆ»¹û£º
class Apple(Fruit):
 def is_gift_fruit(self):
  return True
ͬÑùµÄ£¬ÎÒÓÖÈ¥³ýÁËһЩÎÞÐè¹Ø×¢µÄ´úÂ룬²¢ÇÒ´òËãÔÚ½ÓÏÂÀ´µÄÐÐÎÄÖв»ÔÙÌáÐÑÕâÒ»µã¡£
AppleÊÇÒ»ÖÖFruit¡£ËùÒÔÉÏÃæµÄʵÏÖͦ·ûºÏOOµÄÔ­Ôò¡£
½ÓÏÂÀ´ÈÃÎÒÃÇʵÏÖÀæ×Ó°É£º
class Pear(Fruit):
 def is_gift_fruit(self):
  return False
½â¾öÎÊÌâÁË¡£Èç¹ûË®¹ûÁ¬ËøµêÖ»ÂôÆ»¹ûºÍÀæ×ÓÁ½ÖÖË®¹ûµÄ»°¡£
¿Éϧ£¬ÐèÇóºÜ¶à£¬Ä㻹ҪʵÏÖ½Û×ÓºÍÏ㽶ÄØ¡£ÄãдÏÂÁËÕ⼸ÐдúÂ룺 
class Orange(Fruit):
 def is_gift_fruit(self):
  return True
class Banana(Fruit):
 def is_gift_fruit(self):
  return False
ºÃ³ô°¡£¬´úÂëµÄ»µÎ¶µÀ£¡
ÀàAppleºÍÀàOrange³ýÁËÀàÃû²»Í¬£¬¼¸ºõÊÇÍêÈ«Öظ´µÄ´úÂ룻ÀàPearºÍÀàBananaÒ²ÊÇÒ»Ñù¡£
¸ü½øÒ»²ãµÄ˵£¬ÕâËĸöÀ඼²î²»¶à°¡£¬ËùÒÔÎÒÃÇÓбØÒªÖع¹Ò»ÏÂÒÑÓдúÂ룬¸ÄÉÆËüÃǵÄÉè¼Æ¡£ 
¸ÄÉÆÒÑÓдúÂë
ÔĶÁ´úÂ룬Äã¿ÉÒÔ·¢ÏÖË®¹ûÖ»·ÖÁ½ÀࣺһÀàÊÇ¿ÉÒÔ×÷ΪÀñÆ·µÄ£¬Ò»ÀàÊDz»¿ÉÒԵġ£ËùÒÔÏ£Íû¿ÉÒÔÕâÑùÉè¼Æ£º
  Fruit
  / \
 GiftFruit NotGiftFruit
 / \ / \
Apple    Orange Pear Banana
àÅ£¬¼ÓÁËÁ½¸öÖмäÀ࣬¿´ÆðÀ´²»´í£º
class GiftFruit(Fruit):
 def is_gift_fruit(self): 
  return True
class NotGiftFruit(Fruit):
 def is_gift_fruit(self):
  return False
class Apple(GiftFruit):pass
class Orange(GiftFruit):pass
class Pear(NotGiftFruit):pass
class Banana(NotGiftFruit):pass 
ºÃÀ²£¬¿´ÉÏÈ¥ºÜ²»´íŶ£¬´úÂ뾫¼òÁ˲»ÉÙ£¬ÈÎÎñÍê³É¡«
еķ³ÄÕ
½ÓÏÂÀ´ÎÒÃÇÀ´Íê³ÉÁíÒ»ÏÄÜ£ºÌṩˮ¹ûʳÓ÷½·¨×Éѯ¡£
²»ÒªÐ¦Õâ¸öÐèÇó£¬ÕâÊÇÕæʵµÄÊг¡ÐèÇó¡£±ÈÈçÏ൱²¿·ÖÒ»±²×ÓÉú»îÔÚ±±·½µÄÅóÓѾÍûÓгԹýÁúÑÛÀóÖ¦Ï㽶£»¶øÄÏ·½ËäȻˮ¹û·á¸»£¬µ«²»ÖªµÀɽÖñÁñÁ«µÈÑóË®¹ûµÄÒ²´óÓÐÈËÔÚ¡£ÎÒÃÇÕâ¸öË®¹ûÁ¬ËøµêÒµÎñ¼òµ¥£¬Ë®¹ûµÄʳÓ÷½·¨Ò²Ö»·ÖÁ½ÖÖ£ºÒ»ÖÖÊÇ°þƤµÄ£¬Èç½Û×ÓºÍÏ㽶£»ÁíÒ»ÖÖÊÇÏ÷ƤµÄ£¬ÈçÆ»¹ûºÍÀæ×Ó¡£ÈÃÎÒÃÇÐÞ¸ÄÔ­ÓеÄÉè¼Æ£º 
   Fruit
   / \
  GiftFruit NotGiftFruit
  / \ /  \
 PareG...   HuskG... PareNot... HuskNot...
 /  / /  / 
Apple     Orange  Pear  Banana
²»µÃÒÑ£¬ÎÒÃÇÌí¼ÓÁËËĸöÀࣺ
class PareGiftFruit(GiftFruit):
 def eat_method(self): 
  return 'Pare'
class HustGiftFruit(GiftFruit):
 def eat_method(self):
  return 'Husk'
class PareNotGiftFruit(NotGiftFruit):
 def eat_method(self):
  return 'Pare'
class HuskNotGiftFruit(NotGiftFruit): 
 def eat_method(self):
  return 'Husk'
ÔõôÕâËĸöÀàÕâôÏñ°¡£¿º¹¡£¡£¡£¡£
ÏÈÈÌÈÌ£¬°ÑAOPBËÄÖÖË®¹ûµÄʵÏָĸģº
class Apple(PareGiftFruit):pass
class Orange(HuskGiftFruit):pass
class Pear(PareNotGiftFruit):Pass
class Banana(HuskNotGiftFruit):pass 
ÎÒÒѾ­ÈÌÎÞ¿ÉÈÌÁË¡£Õâ¸öÉè¼Æ²»½ö½öÓÖÒýÈëÁ˺ò»ÈÝÒ×Ïû³ýµÄÖظ´´úÂ룬¶øÇÒ»¹ÐÞ¸ÄÁËAOPBÕâËĸöÀàµÄʵÏÖ¡£ÕâÖÖÉè¼ÆµÄÀ©Õ¹ÐÔÒ²²»ºÃ£¬Èç¹ûÒÔºóÒªÌṩˮ¹ûµÄÆäËüÌص㣬±ÈÈçÊǽø¿ÚË®¹û»¹Êǹú²úË®¹û¡£Ìì°¡£¬Õ⻹Á˵㡼ÓÉÏÕâ¸öÌØÐÔ£¬ÎÒҪʵÏÖNativePareGiftFruit¡¢NativeHuskGiftFruitµÈÀ๲8¸ö£¨2µÄÈý´Î·½£©°¡¡£Ë®¹ûµÄÌØÕ÷¶àµÃºÜ£¬Ëæ±ãËãËã¿ÉÄܳ¬¹ý16ÖÖ°¡£¬65536¸öÀࣿ½ÐÎÒÈ¥ËÀ°É¡«µ¥Êdz¤´ï16¸öµ¥´ÊµÄÀàÃûÎҾͱÀÀ£ÁË£¡ 
ÏÖÔÚ£¬ÄãÃǶ¼Ó¦¸ÃÒâʶµ½ÕâÖÖʵÏÖ·½·¨ÊµÔÚÊÇÒ»ÖÖö»öºµÄÉè¼ÆÁË¡£ÄÇ£¬ÎÒÃÇÓ¦¸ÃÔõôÑùÉè¼ÆÄØ£¿
PythonicµÄ·½°¸
¸ÃÊÇMixin³ö³¡µÄʱºòÁË£¡
ÏÈÀ´¿´¿´MixinµÄʵÏÖ°É£º
class Fruit(object):
 pass
class GiftMixin(object):
 def is_gift_fruit(self): 
  return True
class NotGiftMixin(object):
 def is_gift_fruit(self):
  return False
class PareMixin(object):
 def eat_method(self):
  return 'Pare'
class HuskMixin(object):
 def eat_method(self): 
  return 'Husk'
class Apple(GiftMixin, PareMixin, Fruit):pass
class Orange(GiftMixin, HuskMixin, Fruit):pass
class Pear(NotGiftMixin, PareMixin, Fruit):pass
class Banana(NotGiftMixin, HuskMixin, Fruit):pass 
±àÂëÍê³É£¡Õâ¾ÍÊÇMixin£¬¾ÍÊÇÕâô¼òµ¥£¬ÒÔÖÂÎÒÎÞ·¨ÔÙ˵³öÈκÎÑÔÓÒòΪÎÒ¾õµÃÉÏÃæµÄ´úÂëÒѾ­ÍêÕûµØ±í´ïÁËÎÒÏëÒª±í´ïµÄ˼Ïë¡£
×¢Òâ, ÒòΪ Python ÀïÃæ¶àÖؼ̳ÐʱÈç¹û±»µ÷ÓõijÉÔ±º¯ÊýÖ»´æÔÚÓÚ¸¸ÀàÖУ¬Ôò°´ÀàÉùÃ÷µÄ¸¸Àà´Ó×óµ½ÓÒ²éÕÒµ÷ÓõÄ, ËùÒÔÖ÷Àà±»·ÅÔÚÓÒ±ß, MixIn ±»·ÅÔÚ×ó±ß£¬²ÅÄÜÕýÈ·µØµ÷Óõ½MixinµÄ³ÉÔ±º¯Êý¡£
MixinµÄºÃ´¦ÊÇ¿ÉÒÔΪÖ÷ÀࣨÈçFruit£©Ìí¼ÓÈÎÒâ¶àµÄMixinÀ´ÊµÏÖ¶à̬£¬±ÈÈç¸Õ²Å˵µÄË®¹ûÓнø¿ÚºÍ¹ú²úÁ½¸öÌØÕ÷£¬ÏÖÔÚÏ൱ÈÝÒ×ʵÏÖ£º 
class NativeMixin(object):
 def Locality(self):
  return 'Native'
class ForeignMixin(object):
 def Locality(self):
  return 'Foreign'
class Apple(ForeignMixin, GiftMixin, PareMixin, Fruit):pass #½ø¿Úºì¸»Ê¿ 
class Orange(NativeMixin, GiftMixin, HuskMixin, Fruit):pass
class Pear(NativeMixin, NotGiftMixin, PareMixin, Fruit):pass
class Banana(NativeMixin, NotGiftMixin, HuskMixin, Fruit):pass
¼òµ¥¶àÁË£¬Ö»¼ÓÁËÁ½¸öÀ࣬¶ÔAOPBµÄʵÏÖÒ²Ö»ÊÇÔö¼ÓÁËÒ»¸ö»ùÀࣨÔö¼Ó×ÜÊÇʤ¹ýÐ޸ģ©¡£ 
ÀûÓÃMixinÎÒÃÇ»¹¿ÉÒÔÔö¼ÓÎÞÊý×ÜÌØÕ÷£¬¶øÎÞÐè¶ÔÒÑÓдúÂë×÷Ì«´ó¸Ä¶¯¡£
ÁíÍ⣬ÎÒÃÇ»¹»ñµÃÁË¿ÉÖØÓÃÐÔ¡£±ÈÈçNativeMixinºÍForeignMixin¸úÖ÷ÀàHuman½áºÏ£¬¿ÉÒÔ×ö³ö¹úÈ˺ÍÀÏÍâÁ½¸öÀàŶ¡«Ò²ÐíË®¹ûÁ¬ËøµêÈí¼þÒÔºó»á¿¼ÂǼǼ¹ØÓÚ¿Í»§ÊÇ·ñÍâ¹úÈ˵ÄÐÅÏ¢ÄØ¡£
³ý´ËÖ®Íâ
Õâʱºò£¬Äã¿ÉÄÜ»á˵£ºË®¹ûÁ¬ËøµêÈí¼þÖ»ÊÇÄã¶Å׫µÄÒ»¸öÏîÄ¿£¬MixinÓÐʲôʵ¼ÊÓô¦Â𣿵±È»ÓÐÀ²£¡ÆäʵMixin²¢²»ÊÇʲô¸ß½×µÄPython¼¼ÇÉ£¬ÔçÓоͺܶ࿪ԴÏîĿʹÓÃÕâ¸ö¼¼ÇÉÁË£¬µäÐ͵ģ¬±ÈÈçPythonÏîÄ¿°¡£¡ÔÚPython×Ô´øµÄSocketServer.pyÀï¾ÍÓ¦ÓÃÁËMixinÀ´ÊµÏÖ»ùÓÚ½ø³ÌºÍ»ùÓÚÏ̵߳ÄÁ½ÖÖTCP/UDP·þÎñÄ£ÐÍ£¬ÔÚTkinterºÍPythonµÄÆäËüÄ£¿éÒ²¿ÉÒÔ¼ûµ½ËüµÄ×Ù¼££¬Èç¹ûÄãÁôÒâµÄ»°¡£
# SocketServer.py ÀïµÄMixin
class ForkingUDPServer(ForkingMixIn, UDPServer): pass
class ForkingTCPServer(ForkingMixIn, TCPServer): pass 
class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
È·ÇÐÀ´Ëµ£¬ÎÒ¶ÔMixinÀ´ÊµÏÖµÄË®¹ûÁ¬ËøµêµÄʵÏÖÈÔÈ»Ï൱²»ÂúÒ⣬µ«Èç¹ûÎÒÃÇÏëÒª×ã¹»ÃæÏò¶ÔÏó£¬Ò²¾Í»ù±¾ÉÏÖ»ÄܽÓÊÜÈç´Ë½â¾ö·½°¸ÁË¡£Èç¹ûÓÐÒ»ÌìÄã²»ÄÜÈÌÊÜÿÔö¼ÓÒ»ÖÖÌØÕ÷Äã¾Í±ØÐë±àдN£¨N>=2£©¸öMixin£¬È»ºó¶¼±ØÐë¸øÒѾ­´æÔÚµÄAOPB´úÂëÔö¼ÓÒ»¸ö»ùÀࣨÏëÏ룬ˮ¹ûµêÂôµÄ¿É²»Ö¹ËÄÖÖË®¹û£¬Äã»á¸üÍ·´ó£©£¬ÄÇ£¬¾Í¿¼ÂÇ°ÑOOÅ×Æú°É£¡ 
Ãùл
ÔÚ±¾ÎijÉÎĹý³ÌÖУ¬ÉòáË( http://eishn.blog.163.com <http://eishn.blog.163.com/> )¸øÎҺܴó°ïÖú£¬ÌØ´ËÃùл¡£ 


--~--~---------~--~----~------------~-------~--~----~
'''ÓʼþÀ´×ÔGroups "python-cn"--China Py User Group 
ÏêÇé: http://groups-beta.google.com/group/python-cn 
·¢ÑÔ: python-cn在googlegroups.com 
Í˶©: python-cn-unsubscribe在googlegroups.com 
ά»ù: http://wiki.woodpecker.org.cn/moin/CPUG 
ͬÀàÁбí: http://python.cn/mailman/listinfo/python-chinese 
ÉçÇøÊÂÎñ: http://groups.google.com/group/CPUG 
±±¾©ÊÂÎñ: http://groups.google.com/group/bpug 
¶«ÄÏÊÂÎñ: http://groups.google.com/group/cpug-eastchina 
''' 
-~----------~----~----~----~------~----~------~--~---




_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn 
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to   python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese





-- 
ÂíºêÁÁ 

-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070620/b80806a5/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号