Python与C++的GP比较

SnowFalcon 2001-10-12 04:06:33
上次myman对python的GP没有什么兴趣。那我今天就写上一段代码,看看是否能够提起myman的兴趣。
代码很简单用冒泡排序对一组数据进行排序,虽然python有自己的sort函数但是我想自己写一个
可能更加好理解也更加能够提起myman的兴趣
代码如下

class UpSort:
def sort (self,List,CompareFucntion):
"对一个列表依据自定义的比较函数作升排序"
for k in List:
for o in List:
if getattr(self,CompareFucntion )(k,o)==1:
temp=List[List.index(k)]
List[List.index(k)]=o
List[List.index(o)]=temp
class DownSort:
def sort (self,List,CompareFucntion):
"对一个列表依据自定义的比较函数作升排序"
for k in List:
for o in List:
if getattr(self,CompareFucntion )(k,o)==0:
temp=List[List.index(k)]
List[List.index(k)]=o
List[List.index(o)]=temp

class MySort:

def __init__(self):
#定义原始数据
self.li=[5,8,45,2,68,90,12,67,23,89,29,38,0]
def mycmp (self,p,q):
"自定义比较函数"
if p>q:
return 1
else:
return 0

def excuteSort():
#为MySort装配UpSort功能
MySort.__bases__+=(UpSort,)
#生成MySort对象
obj=MySort()
#对原始数据作升排序
obj.sort(obj.li,"mycmp")
print obj.li
#为MySort删除UpSort功能
MySort.__bases__=tuple(list(MySort.__bases__).remove(UpSort))
#为MySort添加DownSort功能
MySort.__bases__+=(DownSort,)
#对原始数据作降排序
obj.sort(obj.li,"mycmp")
print obj.li

if __name__ == "__main__":
#执行程序
excuteSort()

执行结果
[90, 89, 68, 67, 45, 38, 29, 23, 12, 8, 5, 2, 0]
[0, 2, 5, 8, 12, 23, 29, 38, 45, 67, 68, 89, 90]

这段代码可能些的有写罗嗦,其实类MySort可以写一个upcmp和一个downcmp,然后传入sort函数同样可以完成功能我只所以要这些写无非要突出python的Mix_in的特性。在c++或者java中无论你用继承还是用gp一旦类的定义完成将不可能更改它的自己的语义,也就是说他们是静态语义的

譬如 用gp c++这样写
template <class T>

class DownSort {

DownSort()
{
..........
}
};

template <class T>

class UpSort {

UpSort()
{
..........
}
};


DownSort<char*> Ds;
Ds.DownSort()
UpSort<char*> Us;
Us.DownSort()

class DownSort {

DownSort()
{
..........
}
};



class UpSort {

UpSort()
{
..........
}
};

如果用继承
Class Sort :public DownSort,UpSort
{

}


但是在PYTHON中间的实现完全靠PYTHON的Mix_in.MySort类一开始没有任何SORT的功能,当我用Mix_in特性为MYSORT上加上一个DOWNSORT然后生成的对象就具有DOWNSORT功能,当我把DOWNSORT卸载掉然后加入UPSORT功能它又能加上UPSORT功能。这样的Mix_in的特性当然在C++或者JAVA中都可以用继承来实现但是继承就带来了结构上的臃肿和冗余,可能我要DOWNSORT而不要UPSORT的时候在C++或者JAVA中无论如何都要为一个类定义两种功能而PYTHON你可以随时装配。PYTHON就好比是一个可拆卸的自行车,用GP的思想实现各种各样的算法然后用过Mix_in特性装配到你需要的地方。而c++或者java只能是要多少装多少的重型卡车。PYTHON及能够实GP的现数据与算法的分离又降低了继承的层次性。
另外Python的动态语义特性能够比c++的函数指针能更好的处理gp中的抽象。
在sort函数中python通过系统函数getattr的来识别由CompareFucntion传入的函数字符串比如我传入"mycmp"然后getattr就能够得到mycmp的运行实例后面加两个参数就能够正确的运行函数
def sort (self,List,CompareFucntion):
"对一个列表依据自定义的比较函数作升排序"
for k in List:
for o in List:
if getattr(self,CompareFucntion )(k,o)==1:
在stl中相同的功能是这样处理的
sort(vectro.being(),vector.end(),mycmp)
他通过函数指针来处理
这样做的最大的好处在于可以避免冗长的switch case或者if else语句





...全文
177 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
babysloth 2002-04-13
  • 打赏
  • 举报
回复
恶魔老大,您写了半天怎么还是看不懂要说明什么啊?
怎么拿算法在继承?
能给出应用的例子么?
SnowFalcon 2002-03-31
  • 打赏
  • 举报
回复
将出问题的那句话换成
MySort.__bases__=()
kaede 2002-03-31
  • 打赏
  • 举报
回复
第一个例子无法编译通过啊

file "F:\WorkSpace\Python\sort.py", line 41, in excuteSort
MySort.__bases__=tuple(list(MySort.__bases__).remove(UpSort))
TypeError: tuple() argument must be a sequence

(python 2.1.1)
szayang 2002-03-02
  • 打赏
  • 举报
回复
已阅
SnowFalcon 2001-10-16
  • 打赏
  • 举报
回复
To plpliuly:
所谓的traits只是指有类似的算法,通过莫板来统一处理不同的对象类型。而我们看看我的
upsort和downsort是两个截然不同的算法,虽然他们仅仅是if判断的真假不一样。如果我们换成
两个不相同的算法呢?
变成bubblesort和quicksort两个算法还能用traits来统一到一个对象实例中么?你仍然要维护两个不同的类同时在使用的时候需要定义两个不同的莫板实例。
你可以在进一步讲说我可以写两个莫板函数,用的时候我们可以把不同的类实例传入。但是如果我们把一个算法扩展到多个算法用类包装以后又如何呢恐怕还是需要多继承来做吧。

Only_I 2001-10-15
  • 打赏
  • 举报
回复
.
myan 2001-10-15
  • 打赏
  • 举报
回复
to SnowFalcon:
我寄给你的信(sina信箱)被退回,用其他的信箱与我练习。谢谢!
plpliuly 2001-10-15
  • 打赏
  • 举报
回复
其实,traits对于type的dispatch作用更为显著,象这个问题用function object更直接了当。
plpliuly 2001-10-15
  • 打赏
  • 举报
回复
在C++中,用traits就是解决这种问题的一个Idiom。它对这种问题解决的非常漂亮。如果有兴趣你可以看看程序员杂志或者c++ view中关于traits的文章,千万不要过早地得出"无论如何"的结论。(我好像记得myan曾经翻译过andreu的一篇关于traits的文章放在csdn文档中心。)
SnowFalcon 2001-10-12
  • 打赏
  • 举报
回复
up,等待myman
SnowFalcon 2001-10-12
  • 打赏
  • 举报
回复
up,等待myman
SnowFalcon 2001-10-12
  • 打赏
  • 举报
回复
另外python同样可以模拟c++的stl譬如我把上面的程序改成如下的
方式和c++中的一样除了没有用template以外
def sort (List,CompareFucntion):
"对一个列表依据自定义的比较函数作升排序"
for k in List[:]:
for o in List[:]:
if apply(CompareFucntion,(k,o))==0:
temp=k
List[List.index(o)]=temp
List[List.index(k)]=o


def upcmp(p,q):
"自定义比较函数"
if p>=q:
return 1
else:
return 0

def downcmp(p,q):
"自定义比较函数"
if p>=q:
return 0
else:
return 1


def excuteSort():
li=[5,8,45,2,68,90,12,67,23,89,29,38,0]
sort(li,upcmp)
print li
sort(li,downcmp)
print li

if __name__ == "__main__":
#执行程序
excuteSort()

10,608

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 其他
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧