免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 15920 | 回复: 9
打印 上一主题 下一主题

python里面也有java中的抽象类和接口吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-09 22:47 |只看该作者 |倒序浏览
好比,java里面写applet程序,需要继承applet,如果写事件,还要用到事件的接口。

python里面实现类似的功能需要哪方面的知识呢?

我写过一个类是继承BaseHTTPServer的,我照抄的SimpleHTTPServer的代码来实现
例如doGET之类的请求。
虽然代码写出来了,也能用,但是不明白其中的道理,有高手可以解释一下吗?

论坛徽章:
0
2 [报告]
发表于 2006-06-09 22:58 |只看该作者
在python没有内置的接口功能,不过已经作为新版本考虑的内容了。而且在python中对于接口的需求主要集中在框架设计上,而不象在java中使用得那么频繁。主要原因我想可能是:

1.python的自省功能强大。只要调用的对象有相应的属性和方法即可,对于对象的所属类没有什么要求。虽然不象接口那样有严格的定义,但使用决对是方便。
2.python支持多重继承,可以解决单根继承带来的问题。

因此对于接口可以通过多种方式来满足要求,而且很灵活。

所以象你上面的例子,而是简单的继承而已。对于可以定制的方法只要在派生类中进行覆盖即可。

论坛徽章:
0
3 [报告]
发表于 2006-06-10 08:27 |只看该作者
但是我不明白的是,为什么GET请求来的时候,就会自动调用这个函数名下面的东西呢?
这个是谁规定的?是基类?还是基类的基类?
他们处理这种类似于事件驱动的东西,使用的什么样的一种机制?
谢谢。。

论坛徽章:
0
4 [报告]
发表于 2006-06-10 08:55 |只看该作者
这就是框架实现的功能啊。举个简单的例子:


  1. def deal(obj):
  2.     print obj.func()
复制代码


上面这个函数会自动调用obj对象的func()方法。因此在java中这样的用法需要定义一个interface,而python不需要管它。而且obj到底是一个什么对象都无所谓,只要有这个方法就行。

然后


  1. class A:
  2.     def func(self):
  3.         print 'A'

  4. class B(A):
  5.     def func(self):
  6.         print 'B'

  7. a = A()
  8. b = B()
  9. deal(a)
  10. deal(b)
复制代码


这样不管a还是b都可以执行。关键要看调用函数是如何调用的。意思是一样的。

论坛徽章:
0
5 [报告]
发表于 2006-06-10 13:37 |只看该作者
也就是说,BaseHTTPServer 类或者它的基类,当收到用户HTTP报文的时候,会针对报文内容进行判断,然后存在一个地方包含对doGet()的调用,尽管这个函数还没有实现?
然后我在派生类中直接写doGET的实现部分,也就是实现了对GET请求时候的处理?
我似乎有点悟出来了,,,

论坛徽章:
0
6 [报告]
发表于 2006-06-10 13:51 |只看该作者
对基本上就是这个意思。这与java的框架编程是一样的。比如在请求的handler的处理中有关于某个处理器对应的doGet的调用,但此时框架只关心如何调用,至于如何处理,或者预先写一个缺省的处理器类,或者可以让用户根据缺省类进行派生,覆盖你关心的方法,不关心的可以使用缺省的处理方法来处理。因此在生成server时,通过传入处理器类,这样可以由框架根据类来自动创建实例。而这个类则完全是客户来定制的。因此一旦框架写好了。以后有特殊处理只要派生新的类,覆盖要处理的方法,即可。非常方便。

论坛徽章:
0
7 [报告]
发表于 2006-06-10 13:59 |只看该作者
谢谢,又学到了不少知识。

论坛徽章:
1
水瓶座
日期:2014-03-20 18:21:14
8 [报告]
发表于 2006-06-13 22:56 |只看该作者
java中的抽象类是为了实现c++中的抽象类和模板之类的东西
接口是为了解决java不能多继承的问题

很显然楼主是从java才开始接触面向对象程序设计的。实际上java的“接口”是一个特例而非普通现象。如果可以多继承的话,那还要接口干什么?

实际上python才是最符合现实逻辑的“面向对象”
python允许多继承,正如现实中,你既是公民也是纳税人,我们直接使用这些“类”而不需要特别的创建什么“纳税人接口”
python中所有的类,都是抽象类,或者说根本不存在抽象类,类方法可以直接使用,“类”本身在定义的时候就已经实例化,你可以通过输入:某类[回车]看到其内存句柄。这是符合事实的,并且时简约明了的。
而在C++和java当中,一个类定义了以后,肯定是占用了内存空间,但是同时他又没有实例化,如果要使用的话还得实例化一次,又要占用一些内存空间。而类定义所占用的内存空间,使用率很低。
python中不存在“基类”的概念,也没有单根,更没有基本类型,所有的一切都是对象。
python是无神论的最完美体现,没有亚当,没有上帝,没有鬼神,没有唯一的主。你爱信什么信什么,爱是什么是什么,没有任何约束,但是不能存在特殊。

另外,python根本没有意义去模仿java的接口,因为那完全没必要,python的标准类就完全包含java中的接口的所有功能。倒是模仿一下c++的模板会有些实际用途。

论坛徽章:
0
9 [报告]
发表于 2006-06-14 08:45 |只看该作者
在做框架时,以于传入对象做一些约定,还是很有必要,象zope3/twisted等都使用了接口的机制。主要是为了保证传入对象的正确性。

而对于C++的模板(或叫泛型),我看倒没有必要摸仿,因为python本身就是动态类型,传什么都行。已经就是这种方式了。

论坛徽章:
0
10 [报告]
发表于 2006-06-14 09:23 |只看该作者
接口更重要的是它代表的是一套“标准”!
ps:大公司都是靠玩标准赚钱的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP