﻿<?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++博客-Linux,C/C++,网络......-随笔分类-[52] Python</title><link>http://www.cppblog.com/volant/category/12076.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 25 Apr 2014 22:49:39 GMT</lastBuildDate><pubDate>Fri, 25 Apr 2014 22:49:39 GMT</pubDate><ttl>60</ttl><item><title>Python的staticmethod和classmethod</title><link>http://www.cppblog.com/volant/archive/2014/04/16/206602.html</link><dc:creator>小夜</dc:creator><author>小夜</author><pubDate>Wed, 16 Apr 2014 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/volant/archive/2014/04/16/206602.html</guid><wfw:comment>http://www.cppblog.com/volant/comments/206602.html</wfw:comment><comments>http://www.cppblog.com/volant/archive/2014/04/16/206602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/volant/comments/commentRss/206602.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/volant/services/trackbacks/206602.html</trackback:ping><description><![CDATA[最近专职做起了Python，得积累些Python的知识。<br />-----------------<br />阅读代码的时候，看到了classmethod。staticmethod用的挺多，classmethod一直没用过，感觉有些迷惑。<br />Google了一篇文章，讲的挺清楚：<a href="http://www.libaoyin.com/2013/08/06/pyhton-staticmethod-classmethod/" target="_blank" title="pyhton静态方法和类方法">pyhton静态方法和类方法</a>。上面这篇文章主要讲原理，我这里主要说说二者的相同和区别。<br /><ol><li>都可以通过类调用；</li><li>都可以通过对象调用；</li><li>都可以继承和复写；</li><li>都可以使用类属性、类方法和类的静态方法；</li><li>使用这些属性或方法时，staticmethod必须直接通过类名进行调用，classmethod可以优雅的通过参数cls调用。</li></ol>在进行属性或方法调用时：staticmethod需要硬编码指明方法的类，如果存在继承，无法使用子类复写的方法和属性，比较适合用于对其他方法和属性不依赖或依赖较少的情况；classmethod通过cls进行调用，这个cls是调用时传入的类，可以是父类，也可以是子类，适合用于对其他方法和属性依赖较多的情况，也适用于需要通过集成扩展的情况。<br /><br />下面的代码，简单试验了两者的区别，并通过staticmethod简单的模拟了classmethod的操作：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;Base(object):<br />&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">Base</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@classmethod<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;foo(cls):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;cls.name<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@staticmethod<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;foo_static1():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;Base.name<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@staticmethod<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;foo_static2(cls):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;cls.name<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@staticmethod<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;foo_static3(cls):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;if&nbsp;not&nbsp;isinstance(cls,&nbsp;type):</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;isinstance(cls,&nbsp;Base):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cls&nbsp;=&nbsp;cls.<span style="color: #800080; ">__class__</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;cls.name<br /><br /><br /><span style="color: #0000FF; ">class</span>&nbsp;A(Base):<br />&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">A</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;<span style="color: #800080; ">__init__</span>(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.name&nbsp;=&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">I&nbsp;am&nbsp;'%s'</span><span style="color: #800000; ">"</span>&nbsp;%&nbsp;A.name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;B(Base):<br />&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">B</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;<span style="color: #800080; ">__init__</span>(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.name&nbsp;=&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">I&nbsp;am&nbsp;'%s'</span><span style="color: #800000; ">"</span>&nbsp;%&nbsp;B.name<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@classmethod<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;foo(cls):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">&lt;%s&gt;</span><span style="color: #800000; ">"</span>&nbsp;%&nbsp;cls.name<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@staticmethod<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">def</span>&nbsp;foo_static1():<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">&lt;%s&gt;</span><span style="color: #800000; ">"</span>&nbsp;%&nbsp;Base.name<br /><br /><br /><span style="color: #0000FF; ">def</span>&nbsp;testA():<br />&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;=&nbsp;A()<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo()<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo_static1()<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo_static2(A)<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo_static2(obj)<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo_static3(A)<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo_static3(obj)<br />&nbsp;&nbsp;&nbsp;&nbsp;A.foo()<br />&nbsp;&nbsp;&nbsp;&nbsp;A.foo_static1()<br /><br /><span style="color: #0000FF; ">def</span>&nbsp;testB():<br />&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;=&nbsp;B()<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo()<br />&nbsp;&nbsp;&nbsp;&nbsp;obj.foo_static1()<br /><br /><br /><span style="color: #0000FF; ">def</span>&nbsp;run_test(func,&nbsp;*args,&nbsp;**kwargs):<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">=======================</span><span style="color: #800000; ">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;func(*args,&nbsp;**kwargs)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">print</span>&nbsp;<span style="color: #800000; ">""</span><br /><br /><br /><span style="color: #0000FF; ">if</span>&nbsp;<span style="color: #800080; ">__name__</span>&nbsp;==&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">__main__</span><span style="color: #800000; ">'</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;run_test(testA)<br />&nbsp;&nbsp;&nbsp;&nbsp;run_test(testB)<br />&nbsp; &nbsp;&nbsp;</div><img src ="http://www.cppblog.com/volant/aggbug/206602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/volant/" target="_blank">小夜</a> 2014-04-16 12:01 <a href="http://www.cppblog.com/volant/archive/2014/04/16/206602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python内置函数--dir</title><link>http://www.cppblog.com/volant/archive/2009/10/16/98773.html</link><dc:creator>小夜</dc:creator><author>小夜</author><pubDate>Fri, 16 Oct 2009 12:32:00 GMT</pubDate><guid>http://www.cppblog.com/volant/archive/2009/10/16/98773.html</guid><wfw:comment>http://www.cppblog.com/volant/comments/98773.html</wfw:comment><comments>http://www.cppblog.com/volant/archive/2009/10/16/98773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/volant/comments/commentRss/98773.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/volant/services/trackbacks/98773.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.命令介绍最近学习并使用了一个python的内置函数dir，首先help一下：&gt;&gt;&gt;&nbsp;help(dir)Help&nbsp;on&nbsp;built-in&nbsp;function&nbsp;dir&nbsp;in&nbsp;module&nbsp;__builtin__:dir()&nbsp;&nbsp;&nbsp;&nbsp;dir([object])...&nbsp;&nbsp;<a href='http://www.cppblog.com/volant/archive/2009/10/16/98773.html'>阅读全文</a><img src ="http://www.cppblog.com/volant/aggbug/98773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/volant/" target="_blank">小夜</a> 2009-10-16 20:32 <a href="http://www.cppblog.com/volant/archive/2009/10/16/98773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>