|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
小知识: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可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。 |
|