仓酷云

标题: 来看看:python的接口和笼统类 [打印本页]

作者: 愤怒的大鸟    时间: 2015-1-14 21:16
标题: 来看看:python的接口和笼统类
小知识:RHEL是很多大型企业采用的操作系统,但需要向RedHat购买使用权,有偿享受技术支持、版本升级等,所以推荐大家使用CentOS。
笼统基类

有些面向工具的言语,如JAVA,撑持接口,能够声明一个撑持给定的一些******,大概撑持给定存取协定的类。笼统基类(大概ABCs)是Python里一个不异的特征。笼统基类由abc模块组成,包括了一个叫做ABCMeta的metaclass。这个metaclass由内置的isinstance()和issubclass()出格处置,并包括一批会被Python开辟职员普遍用到的基本笼统基类。未来的Python版本大概会到场更多的笼统基类。

好比说有某个特定类你想晓得它是不是撑持dictionary范例的存取。但是dictionary范例是个含混的表述。它大概意味着能够经由过程obj[1]举行存取。那是不是也意味着obj[2]=value这类赋值也起感化呢?又大概该工具将具有keys(),values()和items()***?迭代的变种如iterkeys(),copy()和update()又怎样呢?经由过程工具迭代的iter()呢?

Python2.6的collections模块包含了很多分歧的笼统基类来暗示出这些分歧。Iterable标明一个类界说了__iter__(),Container意味着该类界说了__contains__()***,因而撑持xiny表达式。基础的dictionary接口包含存取数据和keys(),values(),和items(),由MutableMapping笼统基类界说。

你可让你的类承继某个特定的笼统基类,来暗示它们撑持笼统基类接口:

importcollections
classStorage(collections.MutableMapping):

...

别的,你能够不承继基类,以挪用笼统基类的register()***的体例注册该类。

importcollections
classStorage:

...


collections.MutableMapping.register(Storage)

相对你写的类来讲,从笼统基类承继大概更明晰。当你已写了一个新的笼统基类,能形貌一个存在的范例或类,大概你想声明某些第三方类完成了一个笼统基类,
register()***是有效的。比方,假如你界说了一个PrintableType笼统基类,以下是正当的:

#RegisterPythonstypes

PrintableType.register(int)

PrintableType.register(float)

PrintableType.register(str)

类应该遵守由笼统基类指明的语义,可是Python不克不及反省这一点;类作者应当了解笼统基类的需求,并据此完成代码。

要反省一个工具是不是撑持某个特定接口,你能够如许写:

deffunc(d):

ifnotisinstance(d,collections.MutableMapping):

raiseValueError("Mappingobjectexpected,not%r"%d)

不要以为你必需像下面的例子那样,写很多反省性的代码。Python有很强的duck-typing传统,历来不会举行显式的范例反省。代码只是复杂的挪用工具的***,以为这些方
法会存在,假如不存在就会抛出非常。笼统基类反省时必定要审慎,最幸亏十分需要的时分才那样做。

你能够在类的界说顶用abc.ABCMeta作为metaclass写本人的笼统基类:

fromabcimportABCMeta,abstractmethod


classDrawable():

__metaclass__=ABCMeta

@abstractmethod

defdraw(self,x,y,scale=1.0):

pass


defdraw_doubled(self,x,y):

self.draw(x,y,scale=2.0)



classSquare(Drawable):

defdraw(self,x,y,scale):

...

在以上的Drawable笼统基类中,draw_doubled()***会按工具两倍的巨细画出来,而且能够挪用Drawable本人的***来完成。因而完成这个笼统基类的类不必要
供应它们本人的draw_doubled()完成,只管他们能够那样做。但是draw()的完成是必需的;笼统基类不克不及供应一个有效的一样平常完成。

你能够在必需完成的***,如draw()中使用@abstractmethod润色符;Python会对那些没有界说该***的类抛出非常。注重,只要当你试图创立一个子类实例,可是却短少该***的时分才会抛出非常。

>>>classCircle(Drawable):

...pass

...

>>>c=Circle()
Traceback(mostrecentcalllast):

File"<stdin>",line1,in<module>
TypeError:CantinstantiateabstractclassCirclewithabstractmethodsdraw

>>>

笼统数据属性能够用@abstractpropertydecorator声明:

fromabcimportabstractproperty

...


@abstractproperty

defreadonly(self):

returnself._x

子类必需界说一个readonly()属性。

===================================
http://bbs.chinaunix.net/thread-771123-1-1.html
java中的笼统类是为了完成c++中的笼统类和模板之类的器材
接口是为懂得决java不克不及多承继的成绩

很明显楼主是从java才入手下手打仗面向工具步伐计划的。实践上java的“接口”是一个惯例而非一般征象。假如能够多承继的话,那还要接口干甚么?

实践上python才是最切合实际逻辑的“面向工具”
python同意多承继,正如实际中,你既是国民也是征税人,我们间接利用这些“类”而不必要出格的创立甚么“征税人接口”
python中一切的类,都是笼统类,大概说基本不存在笼统类,类***能够间接利用,“类”自己在界说的时分就已实例化,你能够经由过程输出:某类[回车]看到其内存句柄。这是切合现实的,而且时繁复了然的。
而在C++和java傍边,一个类界说了今后,一定是占用了内存空间,可是同时他又没有实例化,假如要利用的话还得实例化一次,又要占用一些内存空间。而类界说所占用的内存空间,利用率很低。
python中不存在“基类”的观点,也没有单根,更没有基础范例,一切的统统都是工具。
python是无神论的最完善表现,没有亚当,没有天主,没有鬼神,没有独一的主。你爱信甚么信甚么,爱是甚么是甚么,没有任何束缚,可是不克不及存在特别。

别的,python基本没成心往仿照java的接口,由于那完整没需要,python的尺度类就完整包括java中的接口的一切功效。却是仿照一下c++的模板会有些实践用处。
====================================
python接口的例子
http://pypi.python.org/pypi/zope.interface
twisted的twistedinternetinterface.py里利用zope.interface


小知识:Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
作者: 第二个灵魂    时间: 2015-1-17 09:05
如果你想深入学习Linux,看不懂因为文档实在是太难了。写的最好的、最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。
作者: 老尸    时间: 2015-1-24 16:30
Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。
作者: 愤怒的大鸟    时间: 2015-2-2 11:32
以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。
作者: 莫相离    时间: 2015-2-7 20:25
学习Linux应具备的。[书籍+网络资源]
作者: 再见西城    时间: 2015-2-23 12:56
熟读Linux系统有关知识,如系统目录树,有关内容可购书阅读或搜索论坛。
作者: 活着的死人    时间: 2015-3-7 10:26
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
作者: 小妖女    时间: 2015-3-21 20:23
清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2