<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
  <channel>
    <title><![CDATA[Q.yuhen]]></title> 
    <link>http://www.rainsts.net/</link> 
    <description><![CDATA[秋雨漏更夜，琴音动心痕。RainTrail Studio.China 2000-2009]]></description> 
    <language>zh-cn</language> 
    <copyright><![CDATA[Copyright 2010, Q.yuhen]]></copyright> 
    <webMaster><![CDATA[qyuhen@hotmail.com (Q.yuhen)]]></webMaster> 
    <generator>LBS v2.0.313</generator> 
    <pubDate>Wed, 10 Mar 2010 15:20:14 +0800</pubDate> 
    <ttl>60</ttl>
  
    <item>
      <title><![CDATA[Python Library: Exec &amp; Compile]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=951]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 10 Mar 2010 10:31:00 +0800</pubDate> 
      <description><![CDATA[直接运行代码字符串也是动态语言的一个重要特征。虽然在 .NET/C# 里也可通过 CodeDom 实现类似的功能，但远没 Python 这么方便自由。<br /><div class="code">&gt;&gt;&gt; code = &quot;&quot;&quot;<br />def test(s):<br />&nbsp;&nbsp;print &quot;test:&quot;, s<br /><br />a = 123<br />&quot;&quot;&quot;<br />&gt;&gt;&gt; exec code<br /><br />&gt;&gt;&gt; a<br />123<br /><br />&gt;&gt;&gt; test(&quot;abc&quot;)<br />test: abc</div><br />内置函数里还有 eval() 和 execfile() 都是用来做类似事情的。exec 关键字执行多行代码片段，eval() 函数通常用来执行一条包含返回值的表达式，而 execfile 自然是用来执行源码文件了。<br /><div class="code">&gt;&gt;&gt; a = 10<br /><br />&gt;&gt;&gt; x = eval(&quot;a + 3&quot;)<br /><br />&gt;&gt;&gt; x<br />13</div><br />eval() 和 execfile() ]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=951]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Library: Encoding]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=950]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Mon, 08 Mar 2010 17:53:23 +0800</pubDate> 
      <description><![CDATA[字符编码转换是个常用的内容。Python 标准库提供了一个 codecs Module，类似 .NET System.Text.Encoding。<br /><br />C# 代码<div class="code">var s = &quot;中国人&quot;;<br />var encoding = Encoding.GetEncoding(&quot;gb2312&quot;);<br /><br />var bytes = encoding.GetBytes(s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Array.ForEach(bytes, b =&gt; Console.Write(&quot;{0:x} &quot;, b));<br />Console.WriteLine();<br /><br />var ds = encoding.GetString(bytes);<br />Console.WriteLine(ds);</div><br />输出:<div class="code">d6 d0 b9 fa c8 cb<br />中国人</div><br />Python 代码<div class="code">#!/usr/bin/env python</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=950]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 11. Metaclasses]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=949]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Mon, 08 Mar 2010 14:16:56 +0800</pubDate> 
      <description><![CDATA[Metaclass 允许我们在 Class Object 创建时插入扩展逻辑，且不需要对目标名进行重新绑定。Python 提供的几种扩展和拦截手段中，Descriptor 针对 Class.Attribute 进行拦截但却非扩展，用于 Class 内在行为的调度；Class Decorator 目标是 Instance Object，可以拦截对象创建和成员调用，但需要对目标名进行重绑定，所有一切都要透过包装进行；Metaclass 要对付的是 Class 本身，它掌控对象之源，搓圆捏扁随意为之。大杀器！不过麻烦也多。如果实在无聊，或者要整一些 NB 的概念，可以试试看。<br /><br />举个简单的例子：假如我们希望对多个没有继承关系的类(class)添加某个通用方法，该怎么做？<br /><br />方法1: 添加包含该方法的扩展基类，反正 Python 支持多重继承。<br />方法2: 利用 Class Decorator ]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=949]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 10. Descriptors (2)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=948]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Mon, 08 Mar 2010 01:24:02 +0800</pubDate> 
      <description><![CDATA[<b>3. Open Class</b><br /><br />Open Class 是脚本语言吸引人的一个重要特征，允许我们在运行时随时增删对象字段和方法。但在 Python 中，我们会发现向对象动态添加方法后，其调用方式和内置方法不尽相同。<br /><div class="code">&gt;&gt;&gt; class MyClass(object):<br />&nbsp;&nbsp;def __init__(self, x = 123):<br />&nbsp;&nbsp;&nbsp;&nbsp;self.x = x<br />&nbsp;&nbsp;def test(self, s):<br />&nbsp;&nbsp;&nbsp;&nbsp;print s, self.x<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&gt;&gt;&gt; o = MyClass()<br /><br />&gt;&gt;&gt; o.test(&quot;abc&quot;)<br />abc 123<br /><br />&gt;&gt;&gt; def test2(self, s):<br />&nbsp;&nbsp;print &quot;test2:&quot;, s, self.x<br /><br />&nbsp;&nbsp;<br />&gt;&gt;&gt; o.test2 = test2<br /><br />&gt;&gt;&gt; o.test2(&quot;abc&quot;) # 为啥一样的方法调用会失败呢？<br /><br />Traceback (most recent call last):</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=948]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 10. Descriptors (1)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=947]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Mon, 08 Mar 2010 00:42:09 +0800</pubDate> 
      <description><![CDATA[Descriptor 提供了另外一种拦截 Attribute 访问的方法。比如我们前面用 property(get, set, del) 定义属性的做法。Descriptor 可以分别拦截 Attribute 的 get, set ,del 操作，并用一个实现了所谓 Descriptor Protocol 的对象来完成相关操作。<br /><div class="code">class Descriptor(object):<br />&nbsp;&nbsp;def __init__(self, name, value):<br />&nbsp;&nbsp;&nbsp;&nbsp;self.name = name<br />&nbsp;&nbsp;&nbsp;&nbsp;self.value = value<br />&nbsp;&nbsp;def __get__(self, obj, objtype):<br />&nbsp;&nbsp;&nbsp;&nbsp;print &quot;get:&quot;, obj, self.name<br />&nbsp;&nbsp;&nbsp;&nbsp;return self.value<br />&nbsp;&nbsp;def __set__(self, obj, value):</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=947]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 9. Decorators (2)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=946]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sun, 07 Mar 2010 18:59:20 +0800</pubDate> 
      <description><![CDATA[<b>3. Decorator Nesting</b><br /><br />看下面的分解伪码，很容易理解。<br /><div class="code">@a<br />@b<br />def func(): ...</div><br />相当于:<div class="code">def func(): ...<br />func = a(b(func))</div><br />写个例子测试一下:<br /><div class="code">def a(func):<br />&nbsp;&nbsp;print &quot;decorator a:&quot;, func<br /><br />&nbsp;&nbsp;def wa(*args):<br />&nbsp;&nbsp;&nbsp;&nbsp;print &quot;wa:&quot;, args<br />&nbsp;&nbsp;&nbsp;&nbsp;func(*args)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return wa<br /><br />def b(func):<br />&nbsp;&nbsp;print &quot;decorator b:&quot;, func<br /><br />&nbsp;&nbsp;def wb(*args):<br />&nbsp;&nbsp;&nbsp;&nbsp;print &quot;wb:&quot;, args<br />&nbsp;&nbsp;&nbsp;&nbsp;func(*args)<br /><br />&nbsp;&nbsp;return wb<br /><br />&nbsp;<br />@a<br />@b<br />def test(s): print &quot;test:&quot;, s</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=946]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 9. Decorators (1)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=945]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sun, 07 Mar 2010 17:43:12 +0800</pubDate> 
      <description><![CDATA[Python Decorator 看上去有点像 C# Attribute，但 Decorator 是一种运行期 Hook，类似 AOP 而非添加 Metadata 数据。简单点说，Decorator 提供了一种方法在函数和类尾部插入自动运行代码，通过重新绑定目标名称为包装类型(Wrapper)来达到拦截目标调用的能力。<br /><div class="code">@decorator<br />def &lt;name&gt;(): ...code block...</div><br />被转换为:<div class="code">def &lt;name&gt;(): ...code block...<br />&lt;name&gt; = decorator(name)</div><br />下次调用 &lt;name&gt;() 实际会调用 decorator.__call__，如此就实现了目标拦截操作。<br /><br /><b>1. Function Decorator</b><br /><br />]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=945]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 8. Exceptions]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=944]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sun, 07 Mar 2010 01:28:28 +0800</pubDate> 
      <description><![CDATA[<b>1. try/except/finally</b><br /><br />Python 的异常处理机制和 C# 蛮像的。<br /><div class="code"># -*- coding: utf-8 -*-<br /><br />class MyException(Exception):<br />&nbsp;&nbsp;def __init__(self, message):<br />&nbsp;&nbsp;&nbsp;&nbsp;Exception.__init__(self)<br />&nbsp;&nbsp;&nbsp;&nbsp;self.message = message<br />&nbsp;<br />def test(s):<br />&nbsp;&nbsp;try:<br />&nbsp;&nbsp;&nbsp;&nbsp;if type(s) is not str: raise MyException(&quot;error!&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;print s<br />&nbsp;&nbsp;except Exception as e:<br />&nbsp;&nbsp;&nbsp;&nbsp;print e.message<br />&nbsp;&nbsp;else:<br />&nbsp;&nbsp;&nbsp;&nbsp;print &quot;noerror&quot;<br />&nbsp;&nbsp;finally:<br />&nbsp;&nbsp;&nbsp;&nbsp;print &quot;finally&quot;<br /><br />test(123)</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=944]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 7. Classes (6)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=943]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sat, 06 Mar 2010 05:50:39 +0800</pubDate> 
      <description><![CDATA[<b>6. Operator Overloading</b><br /><br />和 .NET 类似，Python Class 通过使用特殊名称(__name__)的方法表示某个操作符运算，覆盖(override)这个方法就可以实现操作符重载。<br /><div class="code">&gt;&gt;&gt; class MyClass:<br />&nbsp;&nbsp;def __init__(self, x = 0):<br />&nbsp;&nbsp;&nbsp;&nbsp;self.x = x<br />&nbsp;&nbsp;def __add__(self, o):<br />&nbsp;&nbsp;&nbsp;&nbsp;if not isinstance(o, MyClass): raise TypeError()<br />&nbsp;&nbsp;&nbsp;&nbsp;return MyClass(self.x + o.x)<br />&nbsp;&nbsp;def __str__(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;return &quot;MyClass.x = &quot; + str(self.x)<br /><br />&nbsp;&nbsp;<br />&gt;&gt;&gt; o = MyClass(1) + MyClass(2)<br /><br />&gt;&gt;&gt; o.x<br />3<br /><br />&gt;&gt;&gt; str(o)<br />&#39;MyClass.x = 3&#39;</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=943]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Python Essential: 7. Classes (5)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=942]]></link> 
      <category><![CDATA[Dynamic Language]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sat, 06 Mar 2010 05:47:51 +0800</pubDate> 
      <description><![CDATA[<b>5. Inheritance</b><br /><br />Python 2.6 和 C# 隐式自动从 System.Object 继承不同，如果不在 class 中指定基类，那么不会发生什么隐式继承行为。<br /><div class="code">&gt;&gt;&gt; class MyClass: pass<br /><br />&gt;&gt;&gt; issubclass(MyClass, object)<br />False<br /><br />&gt;&gt;&gt; print MyClass.__dict__<br />{&#39;__module__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None}<br /><br />&gt;&gt;&gt; class MyClass(object): pass<br /><br />&gt;&gt;&gt; issubclass(MyClass, object)<br />True<br /><br />&gt;&gt;&gt; print MyClass.__dict__<br />{&#39;__dict__&#39;: &lt;attribute &#39;__dict__&#39; of &#39;MyClass&#39; objects&gt;, </div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=942]]></wfw:commentRss>
    </item>
      
  </channel>
</rss>
