原文地址为: python的接口和抽象类

抽象基类

有些面向对象的语言,如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()呢?

Python 2.6的collections模块包括了许多不同的抽象基类来表示出这些不同。Iterable表明一个类定义了__iter__(),Container意味着该类定义了__contains__()方法,因此支持x in y表达式。基本的dictionary接口包括存取数据和keys(),values(),以及items(),由MutableMapping抽象基类定义。

你可以让你的类继承某个特定的抽象基类,来表示它们支持抽象基类接口:

import collections
class Storage(collections.MutableMapping):

...

另外,你可以不继承基类,以调用抽象基类的register()方法的方式注册该类。

import collections
class Storage:

...

collections.MutableMapping.register(Storage)

相对于你写的类来说,从抽象基类继承可能更清晰。当你已经写了一个新的抽象基类,能描述一个存在的类型或类,或者你想声明某些第三方类实现了一个抽象基类,
register()方法是有用的。例如,如果你定义了一个PrintableType抽象基类,以下是合法的:

# Register Python's types

PrintableType.register(int)

PrintableType.register(float)

PrintableType.register(str)

类应当遵循由抽象基类指明的语义,但是Python不能检查这一点;类作者应该理解抽象基类的需求,并据此实现代码。

要检查一个对象是否支持某个特定接口,你可以这样写:

def func(d):

if not isinstance(d, collections.MutableMapping):

raise ValueError("Mapping object expected, not %r" % d)

不要认为你必须像上面的例子那样,写许多检查性的代码。Python有很强的duck-typing传统,从来不会进行显式的类型检查。代码只是简单的调用对象的方法,认为这些方
法会存在,如果不存在就会抛出异常。抽象基类检查时一定要谨慎,最好在非常必要的时候才那样做。

你可以在类的定义中用abc.ABCMeta作为metaclass写自己的抽象基类:

from abc import ABCMeta, abstractmethod

class Drawable():

__metaclass__ = ABCMeta
         
  @abstractmethod

def draw(self, x, y, scale=1.0):

pass

def draw_doubled(self, x, y):

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

class Square(Drawable):

def draw(self, x, y, scale):

...

在以上的Drawable抽象基类中,draw_doubled()方法会按对象两倍的大小画出来,并且可以调用Drawable自己的方法来实现。因此实现这个抽象基类的类不需要
提供它们自己的draw_doubled()实现,尽管他们可以那样做。然而draw()的实现是必须的;抽象基类不能提供一个有用的一般实现。

你可以在必须实现的方法,如draw()中应用@abstractmethod修饰符;Python会对那些没有定义该方法的类抛出异常。注意,只有当你试图创建一个子类实例,但是却缺少该方法的时候才会抛出异常。

>>>class Circle(Drawable):

...   pass

...

>>>c=Circle()
Traceback (most recent call last):

File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw

>>>

抽象数据属性可以用@abstractproperty decorator声明:

from abc import abstractproperty

...

@abstractproperty

def readonly(self):

return self._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的twisted\internet\interface.py里使用zope.interface

转载请注明本文地址: python的接口和抽象类

python的接口和抽象类相关推荐

  1. Python如何定义接口和抽象类

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/ ...

  2. python中继承和组合的区别_Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类...

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  3. python接口和抽象类的区别_接口和抽象类有什么区别?

    最近团队在招人:阿里新零售事业群CBU技术部招Java高级&专家,团队主要负责B2B工业品牌业务,坐标杭州滨江,有兴趣的小伙伴私戳我. **************************** ...

  4. 选择Java接口还是抽象类

    很多人有过这样的疑问:为什么有的地方必须使用接口而不是抽象类,而在另一些地方,又必须使用抽象类而不是接口呢?或者说,在考虑Java类的一般化问题时,很多人会在接口和抽象类之间犹豫不决,甚至随便选择一种 ...

  5. 接口类抽象类 封装

      接口类抽象类: 第一版,不好,没有统一化设计,第二版解决. class QQ:def pay(self,money):print('您用qq支付了%s元' % money)class Ali:de ...

  6. Java中接口、抽象类与内部类学习

    2019独角兽企业重金招聘Python工程师标准>>> Java中接口.抽象类与内部类学习 接口与内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类和抽象方法 抽象方 ...

  7. python实现接口_Python | 使用类实现接口

    python实现接口 In this program, we are implementing the concept of Interface using class. Here, Class Sh ...

  8. 深入理解Java的接口和抽象类

    http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口 ...

  9. 接口与抽象类的使用选择

    为什么有的地方必须使用接口而不是抽象类,而在另一些地方,又必须使用抽象类而不是接口呢?或者说,在考虑Java类的一般化问题时,很多人会在接口和抽象类之间犹豫不决,甚至随便选择一种. 首先来了解一下接口 ...

最新文章

  1. android studio 设置 ndk 路径
  2. Windows8 Metro开发 (03) : AppBar控件之BottomAppBar
  3. 手工xxoo Visual Assist X 笔记
  4. wxpython制作表格界面_wxpython入门第二步(布局)
  5. Spring JDBC 框架一个最简单的Hello World级别的例子
  6. Dubbo 高危漏洞!原来都是反序列化惹得祸
  7. Ubuntu18.04 LTS Melodic ROS 教程:使用URDF创建一个虚拟机器人模型
  8. 删除git所有历史记录 仅保留当前文件
  9. 2016-11-15NOIP模拟赛
  10. Java文件上传【通用】
  11. Spark Shuffle之Tungsten-Sort
  12. 计算机教师成绩分析总结与反思,小学教师成绩分析总结与反思
  13. Vue中如何引用富文本?富文本又是啥?
  14. IEEE1588v2解析(4)--透明时钟/一步时钟/二步时钟
  15. java防止注册刷短信攻击_java面试(1)如何防止恶意攻击短信验证码接口
  16. 快速确定针式打印机故障部位方法
  17. c++ vector 一部分_巴博斯制定奔驰C级(W204)全套改装方案,运动范er十足
  18. tp接入富友协议支付
  19. Unity技能CD的冷却效果实现
  20. PPT文件怎么转换成Word?这个方法可以轻松实现

热门文章

  1. jenkins启动一直显示 Jenkins正在启动,请稍后...
  2. 开源游戏服务器框架NoahGameFrame(NF)服务器端环境搭建(二)
  3. 俄罗斯方块游戏开发教程7:消除判断和处理
  4. P2135 方块消除
  5. mongo java 注解,在Java中使用Spring Data MongoDB操作Mong | zifangsky的个人博客
  6. 我在工作群和ChatGPT聊了会天,找到了升职加薪的新思路
  7. crontab -r删除后恢复
  8. 将 腾讯 QLV文件 转成MP4
  9. linux系统下能玩网页游戏下载软件,最适合玩游戏的Linux 系统
  10. 数据湖:网易严选的数据湖实践