??xml version="1.0" encoding="utf-8" standalone="yes"?>手机福利在线,欧美巨乳在线观看,精品国产aⅴhttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/22/292181.htmlFrank_FangFrank_FangSat, 22 Aug 2009 03:07:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/22/292181.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/292181.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/22/292181.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/292181.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/292181.html阅读全文

Frank_Fang 2009-08-22 11:07 发表评论
]]>
Python学习(fn)W记一http://www.aygfsteel.com/fhtdy2004/archive/2009/08/22/292168.htmlFrank_FangFrank_FangFri, 21 Aug 2009 16:02:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/22/292168.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/292168.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/22/292168.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/292168.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/292168.html发现很多公司要求掌握一门脚本语aQ一直也x搞这个,看C++QLinux C~程也只是ؓ(f)?jin)对pȝ更加的了(jin)解,唉,我的工作定位好像一直都不怎么明确Q是要搞个自己最擅长的了(jin)Q以后有旉再搞linuxCQ找工作W一位。。。工作基本定位在 Java+pythonQ大部分公司也不?x)要求一个h既做Java也做C++。再说这语言也是大同异Q关键还是编E思想


d = {"server":"mpilgrim", "database":"master"}

li = ["a", "b", "mpilgrim", "z", "example"]


Tuple 是不可变?list。一旦创Z(jin)一?tupleQ就不能以Q何方式改变它
 t = ("a", "b", "mpilgrim", "z", "example")


q接 list 与分割字W串
>>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s = ";".join(li)
>>> s
'server=mpilgrim;uid=sa;database=master;pwd=secret'
>>> s.split(";")   
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s.split(";", 1)
['server=mpilgrim', 'uid=sa;database=master;pwd=secret']

 


使用 type、str、dir 和其它内|函?/p>

4.3.2. str 函数
str 数据强制{换ؓ(f)字符丌Ӏ每U数据类型都可以强制转换为字W串?

?4.6. str 介绍
>>> str(1)         
'1'
>>> horsemen = ['war', 'pestilence', 'famine']
>>> horsemen
['war', 'pestilence', 'famine']
>>> horsemen.append('Powerbuilder')
>>> str(horsemen)  
"['war', 'pestilence', 'famine', 'Powerbuilder']"
>>> str(odbchelper)
"<module 'odbchelper' from 'c:\\docbook\\dip\\py\\odbchelper.py'>"
>>> str(None)      
'None'  对于单的数据cd比如整型Q你可以预料?str 的正常工作,因ؓ(f)几乎每种语言都有一?/p>

整型{化ؓ(f)字符串的函数?nbsp;
  然?str 可以作用于Q何数据类型的M对象。这里它作用于一个零构建的列表?nbsp;
  str q允怽用于模块。注意模块的字符串Ş式表C包含了(jin)模块在磁盘上的\径名Q所以你的显C?/p>

l果会(x)有所不同?nbsp;
  str 的一个细但重要的行为是它可以作用于 NoneQNone ?Python ?null 倹{这个调用返回字W?/p>

?'None'。你会(x)使用q一Ҏ(gu)改进你的 info 函数Q这一点你很快׃(x)看到?nbsp;


dir 函数q回L对象的属性和Ҏ(gu)列表Q包括模块对象、函数对象、字W串对象、列表对象、字

典对?…… 相当多的东西?

?4.7. dir 介绍
>>> li = []
>>> dir(li)          
['append', 'count', 'extend', 'index', 'insert',
'pop', 'remove', 'reverse', 'sort']
>>> d = {}
>>> dir(d)           
['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values']
>>> import odbchelper
>>> dir(odbchelper)  
['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']

 

最后是 callable 函数Q它接收M对象作ؓ(f)参数Q如果参数对象是可调用的Q返?TrueQ否则返?

False。可调用对象包括函数、类Ҏ(gu)Q甚至类自n (下一章将更多的关注类)?

?4.8. callable 介绍
>>> import string
>>> string.punctuation          
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.join                 
<function join at 00C55A7C>
>>> callable(string.punctuation)
False
>>> callable(string.join)       
True


你已l知?Python 函数是对象。你不知道的是,使用 getattr 函数Q可以得C个直到运行时才知

道名U的函数的引用?

?4.10. getattr 介绍
>>> li = ["Larry", "Curly"]
>>> li.pop                      
<built-in method pop of list object at 010DF884>
>>> getattr(li, "pop")          
<built-in method pop of list object at 010DF884>
>>> getattr(li, "append")("Moe")
>>> li
["Larry", "Curly", "Moe"]
>>> getattr({}, "clear")        
<built-in method clear of dictionary object at 00F113D4>
>>> getattr((), "pop")          
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
AttributeError: 'tuple' object has no attribute 'pop'

 

4.4.1. 用于模块?getattr
getattr 不仅仅适用于内|数据类型,也可作用于模块?

?4.11. apihelper.py 中的 getattr 函数
>>> import odbchelper
>>> odbchelper.buildConnectionString            
<function buildConnectionString at 00D18DD4>
>>> getattr(odbchelper, "buildConnectionString")
<function buildConnectionString at 00D18DD4>
>>> object = odbchelper
>>> method = "buildConnectionString"
>>> getattr(object, method)                     
<function buildConnectionString at 00D18DD4>
>>> type(getattr(object, method))               
<type 'function'>
>>> import types
>>> type(getattr(object, method)) == types.FunctionType
True
>>> callable(getattr(object, method))           
True


使用 getattrQ你能够获得同一函数的同一引用。通常Qgetattr(object, "attribute") {h(hun)?

object.attribute。如?object 是一个模块的话,那么 attribute 可能是定义在模块中的M东西Q函?/p>

、类或者全局变量?/p>


是相当于函数的指针
?4.12. 使用getattr 创徏分发?

import statsout

def output(data, format="text"):                             
    output_function = getattr(statsout, "output_%s" % format)
    return output_function(data)                             
  output 函数接收一个必备参?dataQ和一个可选参?format。如果没有指?format 参数Q其~省

值是 text q完成普通文本输出函数的调用?nbsp;
  你可以连?format 参数值和 "output_" 来创Z个函数名UC为参数|然后?statsout 模块中取

得该函数。这U方式允总后很Ҏ(gu)地扩展程序以支持其它的输出格式,而且无需修改分发函数?/p>

所要做的仅仅是?statsout 中添加一个函敎ͼ比如 output_pdfQ之后只要将 “pdf” 作ؓ(f) format 的参

数g递给 output 函数卛_?nbsp;
  现在你可以简单地调用输出函数Q就像调用其它函C栗output_function 变量是指?statsout ?/p>

块中相应函数的引用?nbsp;

你是否发现前面示例的一?BugQ即字符串和函数之间的松耦合Q而且没有错误(g)查。如果用户传

入一个格式参敎ͼ但是?statsout 中没有定义相应的格式输出函数Q会(x)发生什么呢Q还好,getattr

?x)返?NoneQ它?x)取代一个有效函数ƈ被赋值给 output_functionQ然后下一行调用函数的语句会(x)

p|q抛Z个异常。这U方式不好?

值得?jin)幸的是Qgetattr 能够使用可选的W三个参敎ͼ一个缺省返回倹{?/p>

 

[mapping-expression for element in source-list if filter-expression]

>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
>>> [elem for elem in li if len(elem) > 1]      
['mpilgrim', 'foo']
>>> [elem for elem in li if elem != "b"]        
['a', 'mpilgrim', 'foo', 'c', 'd', 'd']
>>> [elem for elem in li if li.count(elem) == 1]
['a', 'mpilgrim', 'foo', 'c']


使用 and Ӟ在布?yu)(dng)环境中从左到右演算表达式的倹{??'、[]?)、{}、None 在布?yu)(dng)环境中为假Q?/p>

其它M东西都ؓ(f)真。还好,几乎是所有东ѝ默认情况下Q布?yu)(dng)环境中的类实例为真Q但是你?/p>

以在cM定义特定的方法得类实例的演gؓ(f)假?/p>


4.6.1. 使用 and-or 技?
?4.17. and-or 技巧介l?
>>> a = "first"
>>> b = "second"
>>> 1 and a or b
'first'
>>> 0 and a or b
'second'
  q个语法看v来类g C 语言中的 bool ? a : b 表达式。整个表辑ּ从左到右q行演算Q所以先q?/p>

?and 表达式的演算? and 'first' 演算gؓ(f) 'first'Q然?'first' or 'second' 的演gؓ(f) 'first'?nbsp;
  0 and 'first' 演算gؓ(f) FalseQ然?0 or 'second' 演算gؓ(f) 'second'?nbsp;

然而,׃q种 Python 表达式单单只是进行布?yu)(dng)逻辑q算Qƈ不是语言的特定构成,q是 and-or

技巧和 C 语言中的 bool ? a : b 语法非常重要的不同。如?a 为假Q表辑ּ׃?x)按你期望的那?/p>

工作?jin)?你能知道我被q个问题折腾q吗Q不止一ơ?)

 

 

 


Python 支持一U有的语法Q它允许你快速定义单行的最函数。这些叫?lambda 的函敎ͼ是从

Lisp 借用来的Q可以用在Q何需要函数的地方?br /> ?4.20. lambda 函数介绍
>>> def f(x):
...     return x*2
...    
>>> f(3)
6
>>> g = lambda x: x*2 
>>> g(3)
6
>>> (lambda x: x*2)(3)
6

ȝ来说Qlambda 函数可以接收L多个参数 (包括可选参? q且q回单个表达式的倹{lambda

函数不能包含命o(h)Q包含的表达式不能超q一个。不要试囑֐ lambda 函数中塞入太多的东西Q如

果你需要更复杂的东西,应该定义一个普通函敎ͼ然后惌它多长就多长?

 


?4.25. 打印列表
>>> li = ['a', 'b', 'c']
>>> print "\n".join(li)
a
b
c  在你处理列表Ӟq确实是一个有用的调试技巧。在 Python 中,你会(x)十分频繁地操作列表?nbsp;

 

?2.2.1 版本之前QPython 没有单独的布?yu)(dng)数据类型。ؓ(f)?jin)I补这个缺PPython 在布?yu)(dng)环?(?if

语句) 中几乎接受所有东西,遵@下面的规则:(x)
0 ?false; 其它所有数值皆?true?
IZ ("") ?false; 其它所有字W串皆ؓ(f) true?
I?list ([]) ?false; 其它所?list 皆ؓ(f) true?
I?tuple (()) ?false; 其它所?tuple 皆ؓ(f) true?
I?dictionary ({}) ?false; 其它所?dictionary 皆ؓ(f) true?

 


下面?from module import 的基本语法:(x)


from UserDict import UserDict
它与你所熟知?import module 语法很相|但是有一个重要的区别QUserDict 被直接导入到局?/p>

名字I间M(jin)Q所以它可以直接使用Q而不需要加上模块名的限定。你可以导入独立的项或?

from module import * 来导入所有东ѝ?

Python 中的 from module import * ?Java 中的 import module.* QPython 中的 import module ?Java

中的 import module

什么时候你应该使用 from module importQ?

如果你要l常讉K模块的属性和Ҏ(gu)Q且不想一遍又一遍地敲入模块名,使用 from module import

?
如果你想要有选择地导入某些属性和Ҏ(gu)Q而不惌其它的,使用 from module import?
如果模块包含的属性和Ҏ(gu)与你的某个模块同名,你必M?import module 来避免名字冲H?/p>

量用 from module import * Q因为判定一个特D的函数或属性是从哪来的有些困难Qƈ且会(x)?/p>

成调试和重构都更困难?/p>


from UserDict import UserDict

class FileInfo(UserDict):
?Python 中,cȝ基类只是单地列在cd后面的小括号里。不像在 Java 中有一个特D的

extends 关键字?nbsp;

Python 支持多重l承。在cd后面的小括号中,你可以列?gu)多你惌的类名,以逗号分隔?


class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)       
        self["name"] = filename       
                                         一些伪面向对象语言Q像 Powerbuilder 有一U?#8220;扩展”构造函数和其它事g?/p>

概念Q即父类的方法在子类的方法执行前被自动调用。Python 不是q样Q你必须昄地调用在父类中的合适方法?nbsp;
  我告诉过你,q个cd字典一样工作,那么q里是W一个印象。我们将参数 filename 赋值给对象 name 关键字,作ؓ(f)它的倹{?nbsp; 注意 __init__ Ҏ(gu)从不q回一个倹{?nbsp;

Java中是自动调用默认的无参的父类的构造函?/p>

 


?5.9. 定义 UserDict c?

class UserDict:                               
    def __init__(self, dict=None):             
        self.data = {}  ×××××××××××××××××××××××××××××××××××定义cȝ实例变量                         
        if dict is not None: self.update(dict) 
  注意 UserDict 是一个基c,不是从Q何其他类l承而来?nbsp;
  q就是我们在 FileInfo cMq行?jin)覆盖?__init__ Ҏ(gu)。注意这个父cȝ参数列表与子cM同。很

好,每个子类可以拥有自已的参数集Q只要用正的参数调用父类可以了(jin)。这里父cL一个定

义初始值的Ҏ(gu) (通过?dict 参数中传入一个字?Q这一Ҏ(gu)我们?FileInfo 没有用上?br />


××××××××××××××××××××××××××××××××与Java的不?#215;××××××××××××××××××××××××××××××××××
与Java的不同,
1QPython中类的类属性是是在cȝ后面直接定义?br /> 2Q而实例变量是在在__init__Ҏ(gu)中直接定义的使用如下方式self.instancevariable=***定义,
3Q然后Python中实例方法都要显C的加上selfQ相当于Java的this)参数Q方法中引用实例?span style="color: red">量时也要通过self来引?/span>

Python 支持数据属?(?Java 叫做 “实例变量”Q在 C++ 中叫 “数据成员”)Q它是由某个特定的类?/p>

例所拥有的数据。在本例中,每个 UserDict 实例拥有一?data 数据属性。要从类外的代码引用

q个属性,需要用实例的名字限定它Qinstance.dataQ限定的Ҏ(gu)与你用模块的名字来限定函C

栗要在类的内部引用一个数据属性,我们使用 self 作ؓ(f)限定W。习(fn)惯上Q所有的数据属性都?

__init__ Ҏ(gu)中初始化为有意义的倹{然而,qƈ不是必须的,因ؓ(f)数据属性,像局部变量一P

当你首次赋给它值的时候突然生?nbsp;
×××××××××××××××××××××××××××××××××与Java的不?#215;×××××××××××××××××××××××××××××××××

Java 支持通过参数列表的重载,也就?一个类可以有同名的多个Ҏ(gu)Q但q些Ҏ(gu)或者是参数?/p>

C同,或者是参数的类型不同?br /> Python 两种都不支持QM是没有Q何Ş式的函数重蝲。一?__init__ Ҏ(gu)是一?__init__ Ҏ(gu)

Q不它有什么样的参数。每个类只能有一?__init__ Ҏ(gu)Qƈ且如果一个子cL有一?__init__

Ҏ(gu)Q它L 覆盖父类?__init__ Ҏ(gu)Q甚臛_cd以用不同的参数列表来定义它?

xZ么不支持Ҏ(gu)重蝲Q是因ؓ(f)Python的参数可以定义默认实参,有缺省?/strong>
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
应该L?__init__ Ҏ(gu)中给一个实例的所有数据属性赋予一个初始倹{这样做会(x)节省你在后面

调试的时_(d)不必为捕捉因使用未初始化 (也就是不存在) 的属性而导致的 AttributeError 异常Ҏ(gu)?/p>

力?
class MP3FileInfo(FileInfo):
mp3file.__class__  is fileinfo.MP3FileInfo true
mp3file.__class__  is fileinfo.FileInfo         false
isinstance(mp3file,fileinfo.MP3FileInfo)  true
isinstance(mp3file,fileinfo.FileInfo)          true

li=[1,2,3]
li2[1,2,3]
li==li2 true   相当于Java的equals()
li is li2 false 相当于Java?=


5.7. 高专用cL?
除了(jin) __getitem__ ?__setitem__ 之外 Python q有更多的专用函数。某些可以让你模拟出你甚臛_

能不知道的功能?

下面的例子将展示 UserDict 一些其他专用方法?

?5.16. UserDict 中更多的专用Ҏ(gu)
    def __repr__(self): return repr(self.data)    
    def __cmp__(self, dict):                      
        if isinstance(dict, UserDict):           
            return cmp(self.data, dict.data)     
        else:                                    
            return cmp(self.data, dict)          
    def __len__(self): return len(self.data)      
    def __delitem__(self, key): del self.data[key]   __repr__ 是一个专用的Ҏ(gu)Q在当调?repr

(instance) 时被调用。repr 函数是一个内|函敎ͼ它返回一个对象的字符串表C。它可以用在M

对象上,不仅仅是cȝ实例。你已经?repr 相当熟?zhn)了(jin),管你不知道它。在交互式窗口中Q当?/p>

只敲入一个变量名Q接着按ENTERQPython 使用 repr 来显C变量的倹{自已用一些数据来创徏一

个字?d Q然后用 print repr(d) 来看一看吧?nbsp;
  __cmp__ 在比较类实例时被调用。通常Q你可以通过使用 == 比较L两个 Python 对象Q不只是

cd例。有一些规则,定义?jin)何时内|数据类型被认ؓ(f)是相{的Q例如,字典在有着全部相同的关

键字和值时是相{的。对于类实例Q你可以定义 __cmp__ Ҏ(gu)Q自已编写比较逻辑Q然后你可以

使用 == 来比较你的类QPython 会(x)替你调用你的 __cmp__ 专用Ҏ(gu)?nbsp;
  __len__ 在调?len(instance) 时被调用。len 是一个内|函敎ͼ可以q回一个对象的长度。它可以

用于M被认为理应有长度的对象。字W串?len 是它的字W个敎ͼ字典?len 是它的关键字的个

敎ͼ列表或序列的 len 是元素的个数。对于类实例Q定?__len__ Ҏ(gu)Q接着自已~写长度的计?/p>

Q然后调?len(instance)QPython 替你调用你?__len__ 专用Ҏ(gu)?nbsp;
  __delitem__ 在调?del instance[key] 时调?Q你可能记得它作Z字典中删除单个元素的Ҏ(gu)?/p>

当你在类实例中?del ӞPython 替你调用 __delitem__ 专用Ҏ(gu)?nbsp;

 
?Java 中,通过使用 str1 == str2 可以定两个字符串变量是否指向同一块物理内存位|。这叫做

对象同一性,?Python 中写?str1 is str2。在 Java 中要比较两个字符串|你要使用 str1.equals

(str2)Q在 Python 中,你要使用 str1 == str2。某?Java E序员,他们已经被教授得认ؓ(f)Q正是因?/p>

?Java ?== 是通过同一性而不是D行比较,所以世界才?x)更好。这些h要接?Python 的这

?#8220;严重~失”可能要花些时间?nbsp;


ord("a") 97
ord("A") 65

 

5.8. cd性介l?
你已l知道了(jin)数据属性,它们是被一个特定的cd例所拥有的变量。Python 也支持类属性,它们?/p>

q本n所拥有的?

?5.17. cd性介l?/p>

class MP3FileInfo(FileInfo):
    "store ID3v1.0 MP3 tags"
    tagDataMap = {"title"   : (  3,  33, stripnulls),
                  "artist"  : ( 33,  63, stripnulls),
                  "album"   : ( 63,  93, stripnulls),
                  "year"    : ( 93,  97, stripnulls),
                  "comment" : ( 97, 126, stripnulls),
                  "genre"   : (127, 128, ord)}


?5.18. 修改cd?Java中的?rn)态变?br /> >>> class counter:
...     count = 0                    
...     def __init__(self):
...         self.__class__.count += 1 #一定得用self.__class__来引用,才是cd量,假如用self.count则定义的是实例变?或者用
            Counter.count +=1
...    
上述代码记录创徏的对象的个数

 

5.9. U有函数
与大多数语言一PPython 也有U有的概念:(x)

U有函数不可以从它们的模块外面被调用
U有cL法不能够从它们的cd面被调用
U有属性不能够从它们的cd面被讉K
与大多数的语a不同Q一?Python 函数Q方法,或属性是U有q是公有Q完全取决于它的名字?

如果一?Python 函数Q类Ҏ(gu)Q或属性的名字以两个下划线开?(但不是结?Q它是私有的Q其?/p>

所有的都是公有的?Python 没有cL法保?的概?(只能用于它们自已的类和子cM)。类Ҏ(gu)?/p>

者是U有 (只能在它们自已的cM使用) 或者是公有 (M地方都可使用)?

?MP3FileInfo 中,有两个方法:(x)__parse ?__setitem__。正如我们已l讨的,__setitem__

是一个专有方法;通常Q你不直接调用它Q而是通过在一个类上用字典语法来调用Q但它是公有

的,q且如果有一个真正好的理由,你可以直接调用它 (甚至?fileinfo 模块的外?。然而,

__parse 是私有的Q因为在它的名字前面有两个下划线?

 
?Python 中,所有的专用Ҏ(gu) (?__setitem__) 和内|属?(?__doc__) 遵守一个标准的命名?fn)?/p>

Q开始和l束都有两个下划Uѝ不要对你自已的Ҏ(gu)和属性用q种Ҏ(gu)命名Q到最后,它只?x)把?(或其它h) 搞ؕ?

#!/usr/bin/env python
#
coding=utf-8
import os
import sys
from UserDict import UserDict

def stripnulls(data):
    
"strip whitespace and null"
    
return data.replace("\00","").strip()

class FileInfo(UserDict):
    
"store file metadata"
    
def __init__(self,filename=None):
        UserDict.
__init__(self)
        
#will trigger the __setitem__ method,and this method be override in the sub class
        self["name"]=filename

class MP3FileInfo(FileInfo):
    
"store ID3v1.0 MP3 tags"
    tagDataMap
={"title":(3,33,stripnulls),
                
"artist":(33,63,stripnulls),
                
"album" :(63,93,stripnulls),
                
"year"  :(93,97,stripnulls),
                
"comment":(97,126,stripnulls),
                
"genre" :(127,128,ord)}

    
def __parse(self,filename):
        
"parse ID3v1.0 tags from Mp3 file"
        self.clear()
        
try:
            fsock 
= open(filename,"rb",0)
            
try:
                fsock.seek(
-128,2)
                tagdata 
= fsock.read(128)
            
finally:
                fsock.close()
            
if tagdata[:3]=="TAG":
                
for tag,(start,end,parseFunc) in self.tagDataMap.items():
                    self[tag] 
= parseFunc(tagdata[start:end])
        
except IOError:
            
pass

    
def __setitem__(self,key,item):
        
if key == "name" and item:
            self.
__parse(item)
        FileInfo.
__setitem__(self,key,item)

def listDirectory(directory,fileExtList):
    
"get list of file info object for files of particular"
    fileList 
= [os.path.normcase(f)
                
for f in os.listdir(directory)]
    fileList 
= [os.path.join(directory,f)
                
for f in fileList if os.path.splitext(f)[1in fileExtList]
    
def getFileInfoClass(filename,module=sys.modules[FileInfo.__module__]):
        
"get file into class from filename extension"
        subclass 
= "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
        
return hasattr(module,subclass) and getattr(module,subclass) or FileInfo
    
return [getFileInfoClass(f)(f) for f in fileList]

if __name__=="__main__":
    
for info in listDirectory("G:\\test",[".mp3"]):
        
print "\n".join(["%s=%s" % (k,v) for (k,v) in info.items()])
        
print
        
        
    


Frank_Fang 2009-08-22 00:02 发表评论
]]>
API转换的问题的解决http://www.aygfsteel.com/fhtdy2004/archive/2009/08/16/291377.htmlFrank_FangFrank_FangSun, 16 Aug 2009 11:30:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/16/291377.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/291377.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/16/291377.html#Feedback2http://www.aygfsteel.com/fhtdy2004/comments/commentRss/291377.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/291377.html阅读全文

Frank_Fang 2009-08-16 19:30 发表评论
]]>
?BCEL 设计字节码(三)(j)直接在方法的调用处添加方?/title><link>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291097.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 13 Aug 2009 15:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291097.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/291097.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291097.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/291097.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/291097.html</trackback:ping><description><![CDATA[     摘要: q个最接近之前提出的API转换问题 q个需要扫描源代码扑ֈ此类的方法调用处Q然后在Ҏ(gu)调用处的前后d指o(h) 卛_代码转换成如下Ş式:(x) public class StringBuilder {     public String buildString(int length) { ...  <a href='http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291097.html'>阅读全文</a><img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/291097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-13 23:10 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?BCEL 设计字节码(二)(j)直接在原Ҏ(gu)上加指o(h)http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291095.htmlFrank_FangFrank_FangThu, 13 Aug 2009 14:53:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291095.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/291095.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291095.html#Feedback2http://www.aygfsteel.com/fhtdy2004/comments/commentRss/291095.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/291095.html阅读全文

Frank_Fang 2009-08-13 22:53 发表评论
]]>
【{】用 BCEL 设计字节?/title><link>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291025.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Thu, 13 Aug 2009 07:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291025.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/291025.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291025.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/291025.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/291025.html</trackback:ping><description><![CDATA[     摘要: 查到一用BCEL?Java ~程的动态性,W?7 部分: ?BCEL 设计字节码,|址是http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/ 字节码处理的工具也挺多,什么时候再看看asm import java.io.FileOutputStream; import org.apache.bcel...  <a href='http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291025.html'>阅读全文</a><img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/291025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-13 15:58 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/08/13/291025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>API转换的问题的提出http://www.aygfsteel.com/fhtdy2004/archive/2009/08/12/290784.htmlFrank_FangFrank_FangWed, 12 Aug 2009 04:16:00 GMThttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/12/290784.htmlhttp://www.aygfsteel.com/fhtdy2004/comments/290784.htmlhttp://www.aygfsteel.com/fhtdy2004/archive/2009/08/12/290784.html#Feedback0http://www.aygfsteel.com/fhtdy2004/comments/commentRss/290784.htmlhttp://www.aygfsteel.com/fhtdy2004/services/trackbacks/290784.html假如现有两个APIQAIPaQ和APIbQ两个api定义的类Q接口,功能均完全相同,但是有写l微差别Q比如说Ҏ(gu)的参数类型不同,Ҏ(gu)的返回g同等{?br /> 比如APIa中一个类A的方法ؓ(f)public int add(String a,String b)
比如APIb中的一个类A的方法ؓ(f) public int add(int a,int b)

之前有一E序是用APIa~写的(现在只提供此E序?class文gQ不提供E序的源代码Q不允许修改E序的源代码Q,现在要ɘq个E序能够在APIb下能够用?Q?br />
Ҏ(gu)一不修改APIb的classes文gQ而是修改应用E序的classes文gQ将扫描原始应用E序的class文gQ将class文g中用到APIa的方法{换成APIb的方??Q这个应该不叫{换,比如在程序中调用a.add("1","2")Ӟ在方法调用前方法栈中的字符串参数{换成数字Q用javassist怎么来做Q用bcel怎么来做Q?

Ҏ(gu)二不修改应用E序的classes文gQ而是修改APIb的classes文gQ是APIb的接口Ş式{换ؓ(f)APIa的Ş式,使用javassist重写APIb的方法,对APIb的所有方法进行包装成APIa的方法,然后使用重写的APIb的classes文g来允许程序。这个用javassist应该比较方便Q用becl?
q个有点不方便?jin),如果APIb的类库比较大的话QAPI间不一致的地方也比较多的话Q都需要自己重写,相当于重新包装了(jin)q个APIbQ需要修改APIb的classes文gQ有可能其他E序要用到这个APIb?br />
q不太清楚,在仔l想x么来做Q接下来的工作自己写两套单的APIQ然后试验试验?br /> 刚开始想的是使用Ҏ(gu)二来做,好像q个不太现实Q应该是E序使用C(jin)哪个Ҏ(gu)Q就对这个方法来q行修改Q还是方法一好点?br /> 再好好看看java虚拟范。。?br />
q个只是一个简单问题的提出Q而我实际要{换的E序要比q个复杂Q但是基本原理就q了(jin)?br /> tmdQ花?jin)一天多把java虚拟范看?jin)好几章Q我都佩服自q学习(fn)能力Q他妈的Z么就找不到实?fn)?jin)Q?/p>

Frank_Fang 2009-08-12 12:16 发表评论
]]>
Java的编E动态?/title><link>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/12/290769.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Wed, 12 Aug 2009 02:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/12/290769.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/290769.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/12/290769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/290769.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/290769.html</trackback:ping><description><![CDATA[<p>W?1 部分Q?#8220; <a cmimpressionsent="1">cdc装?/a>”Q?003 q?4 月)(j) </p> <p>W?2 部分Q?#8220; <a cmimpressionsent="1">引入反射</a>” Q?003 q?6 月)(j) </p> <p>W?3 部分Q? <a cmimpressionsent="1">应用反射</a>" Q?003 q?7 月)(j) </p> <p>W?4 部分Q?#8220; <a cmimpressionsent="1">?Javassist q行c{?/a>” Q?003 q?9 月)(j) </p> <p>W?5 部分Q?#8220; <a cmimpressionsent="1">动态{换类</a>” Q?004 q?2 月)(j) </p> <p>W?6 部分Q?#8220; <a cmimpressionsent="1">?Javassit q行面向斚w的更?/a>”Q?004 q?3 月)(j) </p> <p>W?7 部分Q?#8220; <a cmimpressionsent="1">?BCEL 设计字节?/a>” Q?004 q?4 月)(j) <br /> <br /> <span style="color: #999999">Java ~程的动态性,W?8 部分: </span>用代码生成取代反?br /> http://www.ibm.com/developerworks/cn/java/j-dyn0610/<br /> <br /> <br /> <br /> </p> <img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/290769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-12 10:35 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/08/12/290769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】Hibernate/Spring/Struts架构使用OpenSessionInView的问?/title><link>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/09/290400.html</link><dc:creator>Frank_Fang</dc:creator><author>Frank_Fang</author><pubDate>Sat, 08 Aug 2009 16:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/09/290400.html</guid><wfw:comment>http://www.aygfsteel.com/fhtdy2004/comments/290400.html</wfw:comment><comments>http://www.aygfsteel.com/fhtdy2004/archive/2009/08/09/290400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fhtdy2004/comments/commentRss/290400.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fhtdy2004/services/trackbacks/290400.html</trackback:ping><description><![CDATA[<br /> http://www.javaeye.com/topic/15057<br /> <br /> 值得研究一?br /> <img src ="http://www.aygfsteel.com/fhtdy2004/aggbug/290400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fhtdy2004/" target="_blank">Frank_Fang</a> 2009-08-09 00:14 <a href="http://www.aygfsteel.com/fhtdy2004/archive/2009/08/09/290400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">캵</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ګ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank"> </a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">䶨</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">齭</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Т</a>| <a href="http://" target="_blank">ʶ</a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank">ⶫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">н</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>