﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-mirguest-文章分类-python</title><link>http://www.cppblog.com/mirguest/category/15954.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 02 Feb 2011 04:26:22 GMT</lastBuildDate><pubDate>Wed, 02 Feb 2011 04:26:22 GMT</pubDate><ttl>60</ttl><item><title>[python]用python实现文本菜单</title><link>http://www.cppblog.com/mirguest/articles/139686.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Wed, 02 Feb 2011 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/articles/139686.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/139686.html</wfw:comment><comments>http://www.cppblog.com/mirguest/articles/139686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/139686.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/139686.html</trackback:ping><description><![CDATA[<p>昨天看c++，是关于代理类的。</p>
<p>而代理类的，则包含一整套有继承关系的类。</p>
<p>所以，我突发奇想，不如用继承来实现菜单。</p>
<p>思路是，有个menu类，然后派生，</p>
<p>一个用以放子菜单，</p>
<p>另一个用以实现绑定函数的菜单。</p>
<p>代码如下：</p>
<p><span style="FONT-FAMILY: Courier New"># -*- coding:utf-8 -*-</span></p>
<p><span style="FONT-FAMILY: Courier New">class Menu(object):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __init__(self,label):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.label=label</span></p>
<p><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def click(self):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass</span></p>
<p><span style="FONT-FAMILY: Courier New">class callbackMenu(Menu):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __init__(self,label,callback,father=None):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.label=label</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rcallback=callback</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rfather=father</span></p>
<p><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def click(self,*args,**kwds):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "currentClick",self.label</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if callable(self.rcallback):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rcallback(*args,**kwds)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return None</span></p>
<p><span style="FONT-FAMILY: Courier New">class subMenu(Menu):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __init__(self,label,submenu,father=None):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.label=label</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rsubmenu=submenu</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.rfather=father</span></p>
<p><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def show(self):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i,sub in enumerate(self.rsubmenu):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "[%d] %s"%(i,sub.label)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def click(self):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "currentMenu",self.label</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.show()</span></p>
<p><span style="FONT-FAMILY: Courier New">def showfather(p):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; if(hasattr(p,"rfather") and p.rfather==None):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print p.label</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print p.label,'&lt;-',</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; showfather(p.rfather)</span></p>
<p><span style="FONT-FAMILY: Courier New">def showfather2(p,symbol='-&gt;'):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; if p.rfather==None:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print p.label,</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; showfather2(p.rfather,symbol)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print symbol,p.label,</span></p>
<p><br><span style="FONT-FAMILY: Courier New">def handle(p):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; while True:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print '-'*40</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showfather2(p)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.click()</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get=raw_input("Input:")</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if get in ['q','Q']:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get=int(get)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if get==100:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if hasattr(p,"rfather") and p.rfather!=None:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=p.rfather</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if isinstance(p.rsubmenu[get],callbackMenu):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.rsubmenu[get].click()</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif isinstance(p.rsubmenu[get],subMenu):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp=p</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=p.rsubmenu[get]</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.rfather=fp</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Wrong Input"</span></p>
<p><span style="FONT-FAMILY: Courier New">if __name__=='__main__':</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; sub=subMenu("sub",[callbackMenu("cb1",None),</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callbackMenu("cb2",None)])</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; sub2=subMenu("sub2",[callbackMenu("cb2_1",None),</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callbackMenu("cb2_2",None)])</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; sub3=subMenu(</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "sub3",</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [subMenu("subsub1",</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [callbackMenu("subcb1",None),</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callbackMenu("subcb2",None)]),</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subMenu("subsub2",</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [callbackMenu("sub2cb1",None),</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callbackMenu("sub2cb2",None)])])</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; main=subMenu("Main",[sub,sub2,sub3])</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; handle(main)</span><br>在这里，我用输入100来返回上一级菜单。</p>
<p>现在想想，面向对象的设计真够难的。</p>
<p>第一步抽象就被卡住了。</p>
<p>在沉思录中，作者常常提示&#8220;<strong>用类来表示概念</strong>&#8221;。</p>
<p>但是，现在很犹豫，我的python版本的需不需要继承呢。</p>
<p>另外，引一句在C++编程规范里的，</p>
<p>&#8220;<strong>继承，不是为了重用，而是为了被重用</strong>&#8221;。</p>
<p>我觉得非常有道理，因为我需要一个指针样的东西，</p>
<p>来处理各级菜单，如果提供的接口不一样，就很难用这个</p>
<p>指针了。</p>
<img src ="http://www.cppblog.com/mirguest/aggbug/139686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2011-02-02 12:12 <a href="http://www.cppblog.com/mirguest/articles/139686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入][python]关于函数对象默认值的一则笔记</title><link>http://www.cppblog.com/mirguest/articles/139685.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Wed, 02 Feb 2011 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/articles/139685.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/139685.html</wfw:comment><comments>http://www.cppblog.com/mirguest/articles/139685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/139685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/139685.html</trackback:ping><description><![CDATA[<p>继续研究python中提供的type及他们的成员（<a href="http://docs.python.org/library/inspect.html">http://docs.python.org/library/inspect.html</a>）。</p>
<p>这里是关于函数对象的默认值func_defaults。</p>
<p>我们知道，如果默认值是不变类型的，那么这个默认值是不会变的。</p>
<p>而我现在要做的，就是让默认值能够变化，记录上次的值。</p>
<p>IDLE 2.6.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&gt;&gt;&gt; def f(x=10):<br>&nbsp;f.func_defaults=x,<br>&nbsp;print x</p>
<p>&nbsp;<br>&gt;&gt;&gt; f()<br>10<br>&gt;&gt;&gt; f(2)<br>2<br>&gt;&gt;&gt; f()<br>2<br>&gt;&gt;&gt; </p>
<p>可以看到，这样默认值就被改变了。</p>
<p>其实我们可以对f.func_defaults进行赋值。</p>
<a href="http://hi.baidu.com/mirguest/blog/item/a6da9f64076e3a37ab184cd1.html">阅读全文</a> <br><strong>类别：</strong><a href="http://hi.baidu.com/mirguest/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/mirguest/blog/item/a6da9f64076e3a37ab184cd1.html#comment">查看评论</a><br>文章来源:<a href="http://hi.baidu.com/mirguest/blog/item/a6da9f64076e3a37ab184cd1.html">http://hi.baidu.com/mirguest/blog/item/a6da9f64076e3a37ab184cd1.html</a> 
<img src ="http://www.cppblog.com/mirguest/aggbug/139685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2011-02-02 12:01 <a href="http://www.cppblog.com/mirguest/articles/139685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入][python]关于字符串分割续（适用于3.X）</title><link>http://www.cppblog.com/mirguest/articles/139684.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Wed, 02 Feb 2011 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/articles/139684.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/139684.html</wfw:comment><comments>http://www.cppblog.com/mirguest/articles/139684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/139684.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/139684.html</trackback:ping><description><![CDATA[<p>今天逛贴吧，继续看到那个帖子（<a href="http://tieba.baidu.com/f?z=951652539&amp;ct=335544320&amp;lm=0&amp;sc=0&amp;rn=30&amp;tn=baiduPostBrowser&amp;word=python&amp;pn=30">http://tieba.baidu.com/f?z=951652539&amp;ct=335544320&amp;lm=0&amp;sc=0&amp;rn=30&amp;tn=baiduPostBrowser&amp;word=python&amp;pn=30</a>）有人留言。而且感觉方法很不错，使用的是itertools中的一个工具。在这里向50楼学习了。</p>
<p>from&nbsp;itertools&nbsp;import&nbsp;zip_longest<br><br>def&nbsp;str_split(str,&nbsp;n):<br>&nbsp;&nbsp;&nbsp;&nbsp;"str_split('aabbcc',&nbsp;2)&nbsp;--&gt;&nbsp;['aa',&nbsp;'bb',&nbsp;'cc']"<br>&nbsp;&nbsp;&nbsp;&nbsp;args&nbsp;=&nbsp;[iter(str)]&nbsp;*&nbsp;n<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[''.join(i)&nbsp;for&nbsp;i&nbsp;in&nbsp;zip_longest(*args,&nbsp;fillvalue='')]<br></p>
<a href="http://hi.baidu.com/mirguest/blog/item/49a57fb581ac40e731add12f.html">阅读全文</a> <br><strong>类别：</strong><a href="http://hi.baidu.com/mirguest/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/mirguest/blog/item/49a57fb581ac40e731add12f.html#comment">查看评论</a><br>文章来源:<a href="http://hi.baidu.com/mirguest/blog/item/49a57fb581ac40e731add12f.html">http://hi.baidu.com/mirguest/blog/item/49a57fb581ac40e731add12f.html</a> 
<img src ="http://www.cppblog.com/mirguest/aggbug/139684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2011-02-02 12:01 <a href="http://www.cppblog.com/mirguest/articles/139684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入][python]使用metaclass自动生成set/get方法</title><link>http://www.cppblog.com/mirguest/articles/139683.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Wed, 02 Feb 2011 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/articles/139683.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/139683.html</wfw:comment><comments>http://www.cppblog.com/mirguest/articles/139683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/139683.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/139683.html</trackback:ping><description><![CDATA[<p>在python cookbook的Chapter 20的 Introduction中，有关于<span style="FONT-FAMILY: Courier New">metaclass</span>（元类）的简单介绍，它自动生成了以一个下划线带头的<span style="FONT-FAMILY: Courier New">get</span>方法。</p>
<p>我改进了一下，使其也具有<span style="FONT-FAMILY: Courier New">set</span>方法，当然就是增加了几行代码。</p>
<p><span style="FONT-FAMILY: Courier New">IDLE 2.6.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; class M(type):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __new__(cls, name, bases, classdict):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for attr in classdict.get('__slots__', ( )):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if attr.startswith('_'):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def getter(self, attr=attr):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getattr(self, attr)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def setter(self, val=0, attr=attr):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return setattr(self, attr, val)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classdict['get' + attr[1:]] = getter</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classdict['set' + attr[1:]] = setter</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type.__new__(cls, name, bases, classdict)</span></p>
<p><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; class Point(object):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; __metaclass__ = M</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; __slots__ = ['_x', '_y' ,'_z']</span></p>
<p><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; p=Point()</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; dir(p)</span><br><span style="FONT-FAMILY: Courier New">['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_x', '_y', '_z', 'getx', 'gety', 'getz', 'setx', 'sety', 'setz']</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; p.setx(10)</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; p.getx()</span><br><span style="FONT-FAMILY: Courier New">10</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; </span></p>
<p><span style="FONT-FAMILY: Courier New"><span style="FONT-FAMILY: Arial, 宋体">可以看到，</span>Point <span style="FONT-FAMILY: Arial, 宋体">的</span> __slot__ <span style="FONT-FAMILY: Arial, 宋体">中放入</span>x，y，z<span style="FONT-FAMILY: Arial, 宋体">三个名字，然后就自动生成类似</span>getx，setx<span style="FONT-FAMILY: Arial, 宋体">的方法。</span></span></p>
<p><span style="FONT-FAMILY: Courier New">metaclass <span style="FONT-FAMILY: Arial, 宋体">真是强大啊。</span></span></p>
<a href="http://hi.baidu.com/mirguest/blog/item/a33c7d5314d7ca0b377abe68.html">阅读全文</a> <br><strong>类别：</strong><a href="http://hi.baidu.com/mirguest/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/mirguest/blog/item/a33c7d5314d7ca0b377abe68.html#comment">查看评论</a><br>文章来源:<a href="http://hi.baidu.com/mirguest/blog/item/a33c7d5314d7ca0b377abe68.html">http://hi.baidu.com/mirguest/blog/item/a33c7d5314d7ca0b377abe68.html</a> 
<img src ="http://www.cppblog.com/mirguest/aggbug/139683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2011-02-02 12:01 <a href="http://www.cppblog.com/mirguest/articles/139683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入][python]关于re的sub中替换项是函数的笔记</title><link>http://www.cppblog.com/mirguest/articles/139681.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Wed, 02 Feb 2011 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/articles/139681.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/139681.html</wfw:comment><comments>http://www.cppblog.com/mirguest/articles/139681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/139681.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/139681.html</trackback:ping><description><![CDATA[<p>今天逛百度知道，无意发现，原来re.sub中的替换项可以是一个函数。</p>
<p>这个函数接受一个参数。然后根据需求，返回应该替换的字符串。<br><span style="FONT-FAMILY: Courier New">IDLE 2.6.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; import re</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; r=re.compile(r'a{1,2}')</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; def myrepl(m):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;s=m.group(0)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;if s=='a':</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;return 'one a'</span><br><span style="FONT-FAMILY: Courier New">&nbsp;else:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;return 'two a'</span></p>
<p><span style="FONT-FAMILY: Courier New">&nbsp;</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt; r.sub(myrepl,'a aa aaa')</span><br><span style="FONT-FAMILY: Courier New">'one a two a two aone a'</span><br><span style="FONT-FAMILY: Courier New">&gt;&gt;&gt;</span></p>
<p><span style="FONT-FAMILY: Courier New">下面是摘自python文档（<span style="FONT-FAMILY: Comic Sans MS">The Python Standard Library</span>&nbsp;8.2. <span style="FONT-FAMILY: NSimsun">re</span> — Regular expression operations）：</span></p>
<span style="FONT-FAMILY: Courier New">
<p><span style="FONT-FAMILY: Comic Sans MS">If</span><em><span style="FONT-FAMILY: Comic Sans MS">repl </span></em><span style="FONT-FAMILY: Comic Sans MS">is a function, it is called for every non-overlapping occurrence of</span><em><span style="FONT-FAMILY: Comic Sans MS">pattern</span></em><span style="FONT-FAMILY: Comic Sans MS">. The function takes a single match object argument, and returns the replacement string. For example:</span></p>
<div>
<div><span>&gt;&gt;&gt; </span><span>def</span><span>dashrepl</span><span>(</span><span>matchobj</span><span>):</span><span></span></div>
<div><span>... </span><span>if</span><span>matchobj</span><span>.</span><span>group</span><span>(</span><span>0</span><span>)</span><span>==</span><span>'-'</span><span>:</span><span>return</span><span>' '</span><span></span></div>
<div><span>... </span><span>else</span><span>:</span><span>return</span><span>'-'</span></div>
<div><span></span><span>&gt;&gt;&gt; </span><span>re</span><span>.</span><span>sub</span><span>(</span><span>'-{1,2}'</span><span>,</span><span>dashrepl</span><span>,</span><span>'pro----gram-files'</span><span>)</span><span></span></div>
<div><span>'pro--gram files'</span></div>
</div>
<p>&nbsp;</span></p>
<a href="http://hi.baidu.com/mirguest/blog/item/42411d14ae7fcf0b972b43fc.html">阅读全文</a> <br><strong>类别：</strong><a href="http://hi.baidu.com/mirguest/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/mirguest/blog/item/42411d14ae7fcf0b972b43fc.html#comment">查看评论</a><br>文章来源:<a href="http://hi.baidu.com/mirguest/blog/item/42411d14ae7fcf0b972b43fc.html">http://hi.baidu.com/mirguest/blog/item/42411d14ae7fcf0b972b43fc.html</a> 
<img src ="http://www.cppblog.com/mirguest/aggbug/139681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2011-02-02 12:01 <a href="http://www.cppblog.com/mirguest/articles/139681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入][python]表示算术表达式的树</title><link>http://www.cppblog.com/mirguest/articles/139680.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Wed, 02 Feb 2011 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/articles/139680.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/139680.html</wfw:comment><comments>http://www.cppblog.com/mirguest/articles/139680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/139680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/139680.html</trackback:ping><description><![CDATA[<p>今天看了一遍《C++沉思录》的第八章，作者使用c++实现了表示算术表达式的树。</p>
<p>就是像 <span style="FONT-FAMILY: Courier New">(-3)*(3+3)</span>的树就是：</p>
<p><span><img style="WIDTH: 456px; HEIGHT: 452px" class=blogimg border=0 src="http://hiphotos.baidu.com/mirguest/pic/item/a8be6403d4aedd571c958346.jpg" width=703 height=878 small="0"></span>&#8205;<br></p>
<p>然后，我就用python实现了一下。因为python与C++不同，（作者使用了句柄类），我这里就没考虑这么多。</p>
<p>下面是实现：</p>
<p><span style="FONT-FAMILY: Courier New"># -*- coding:utf-8 -*-</span><br><span style="FONT-FAMILY: Courier New">class One_node(object):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __init__(self,n):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.n=n</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __str__(self):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str(self.n)</span></p>
<p><span style="FONT-FAMILY: Courier New">class Unary_node(object):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __init__(self,op,n):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.op=op</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.n=n</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __str__(self):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "("+self.op+str(self.n)+")"</span><br><span style="FONT-FAMILY: Courier New">class Binary_node(object):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __init__(self,op,left,right):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.op=op</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.left=left</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.right=right</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __str__(self):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "("+str(self.left)+self.op+str(self.right)+")"</span><br><span style="FONT-FAMILY: Courier New">class Ternary_node(object):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __init__(self,left,middle,right):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.left=left</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.middle=middle</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.right=right</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; def __str__(self):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "("+str(self.left)+"?"+str(self.middle)+":"+str(self.right)+")"</span></p>
<p><span style="FONT-FAMILY: Courier New">def Expr(*argc):</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; if len(argc)==1:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return One_node(*argc)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; elif len(argc)==2:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Unary_node(*argc)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; elif len(argc)==3:</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Binary_node(*argc)</span></p>
<p><span style="FONT-FAMILY: Courier New">if __name__=="__main__":</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; x=Expr(10)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print x</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; x=Expr("-",10)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print x</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; x=Expr("*",2,10)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print x</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; x=Expr("*",Expr(10),Expr("-",3))</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print x</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; x=Expr("*",x,x)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print x</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; x=Ternary_node(x,x,x)</span><br><span style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; print x</span><br></p>
<a href="http://hi.baidu.com/mirguest/blog/item/dc98a183e5ac6acbbc3e1e87.html">阅读全文</a> <br><strong>类别：</strong><a href="http://hi.baidu.com/mirguest/blog/category/Python">Python</a>&nbsp;<a href="http://hi.baidu.com/mirguest/blog/item/dc98a183e5ac6acbbc3e1e87.html#comment">查看评论</a><br>文章来源:<a href="http://hi.baidu.com/mirguest/blog/item/dc98a183e5ac6acbbc3e1e87.html">http://hi.baidu.com/mirguest/blog/item/dc98a183e5ac6acbbc3e1e87.html</a> 
<img src ="http://www.cppblog.com/mirguest/aggbug/139680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2011-02-02 12:01 <a href="http://www.cppblog.com/mirguest/articles/139680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>