python 学习笔记.

参考:
http://wiki.woodpecker.org.cn/moin/
dive in python
python documnet
---------------------------------------------
Q: 怎么样在命令行下import自己写的模块?
import sys
sys.path.append("C:\py")
import odbchelper.py
note: python在sys.path这个list中找你import的module
----------------------------------------------
Q: 如何在 tuples 和 lists 之间转换?
list((1,2.3))
-------------------------------------------
Q: 什么是delegation?
Delegation是一个面向对象技术(也被称为一种设计模式)。假设你有个类x并想改变它的某个方法method。 你可以创建一个新类,提供这个method的一个全新实现,然后将其它method都delegate到x中相应的method。
Python程序员可以轻易地实现delegation。比如,下面这个类像一个文件一样使用,但它将所有的数据都转换成大写:
切换行号显示
   1
   2 class UpperOut:
   3       def __init__(self, outfile):
   4             self.__outfile = outfile
   5       def write(self, s):
   6             self.__outfile.write(s.upper())
   7       def __getattr__(self, name):
   8             return getattr(self.__outfile, name)
在这里类UpperOut 重新定义了write() 方法,在调用self.outfile.write()方法之前,将字符串参数 都转换成大写。所有其它的method都delegate到self.outfile 相应的method。这个delegation通过 __getattr__ 方法来完成;关于控制属性存取的更多信息,参考 [../../doc/ref/attribute-access.html the language reference] 。
注意到更多的情况下,delegation使人产生疑惑。 若需要修改属性,还需要在类中定义__settattr__ 方法,并应小心操作。__setattr__ 的实现基本与以下一致:
切换行号显示
   1
   2 class X:
   3      ...
   4      def __setattr__(self, name, value):
   5           self.__dict__[name] = value
   6      ...
大多数__setattr__实现必须修改self.__dict__,用来存储自身的本地状态信息以防止无限递归。
---------------------------------------------
Q: 遍历目录
主是是os模块
C:\py>
C:\py>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'C:\\py'
>>> os.listdir(".")
['apihelper.py', 'apihelpertest.py', 'argecho.py', 'autosize.py', 'BaseHTMLProcessor.py', 'builddialectexamples.py', 'colorize.py', 'dialect.py', 'fibonacci.
py', 'fileinfo.py', 'fileinfo_fromdict.py', 'fullpath.py', 'kgp', 'kgptest.py', 'LICENSE.txt', 'makerealworddoc.py', 'odbchelper.py', 'odbchelper.pyc', 'odbc
helpertest.py', 'openanything.py', 'parsephone.py', 'piglatin.py', 'plural', 'plural-rules.en', 'plural.py', 'pluraltest.py', 'pyfontify.py', 'regression.py'
, 'roman', 'roman.py', 'romantest.py', 'search.py', 'soundex', 'soundex.py', 'soundextest.py', 'statsout.py', 'unicode2koi8r.py', 'urllister.py', 'zh_cn']
>>> os.chdir("zh_cn")
>>> os.getcwd()
'C:\\py\\zh_cn'
>>> os.listdir(os.getcwd())
['makerealworddoc.py']
>>> os.path.isdir("makerealworddoc.py")
False
>>>
----------------------------------------
Q: python 递归
----------------------------------------
Q: 用getattr()初始化一个类,怎么传到类参数?
定义一个类test
class test(name):
    pass
class = getattr(test, "test")("name")
------------------------------------------
Q: python 的全局变量,在模块间共享
参考:
http://www.itpub.net/viewthread.php?tid=822939
以上的问题可以这样解决:
以下是文件:properties.py
class properties(dict):
   
    def __init__(self, full_path):
        f = file(full_path)
        while True:
            line = f.readline()
            if len(line) == 0:
                break
            new_line = line.split("=")
            if new_line[1][-1:] == "\n":
                new_line[1] = new_line[1][:-1]
            self.__setattr__(new_line[0], new_line[1])
        f.close()
               
    def get_value(self, key):
        return self.__getattribute__(key)
        
    def set_value(self, key, value):
        return self.__setattr__(key, value)
   
    def remove_key(self, key):
        return self.__delattr__(key)
   
    def read_file(self, full_path):
        print "is file full path " + full_path
   
it = properties("test.properties")
在别的模块引用的时候:
import properties
properties.it.get_value("kddk")
-------------------------------------
Q: socket.recv
参考:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/408859
#这个方法 如果没有接到流 就退出
#assume a socket disconnect (data returned is empty string) means  all data was #done being sent.
def recv_basic(the_socket):
    total_data=[]
    while True:
        data = the_socket.recv(8192)
        if not data: break
        total_data.append(data)
    return ''.join(total_data)
#这个方法 如果超过时间就退出
def recv_timeout(the_socket,timeout=2):
    the_socket.setblocking(0)
    total_data=[];data='';begin=time.time()
    while 1:
        #if you got some data, then break after wait sec
        if total_data and time.time()-begin>timeout:
            break
        #if you got no data at all, wait a little longer
        elif time.time()-begin>timeout*2:
            break
        try:
            data=the_socket.recv(8192)
            if data:
                total_data.append(data)
                begin=time.time()
            else:
                time.sleep(0.1)
        except:
            pass
    return ''.join(total_data)