接口类、抽象类和封装都是和类相关的一些知识概念。

接口类

在说明什么是接口类之前我们先来引入一个问题,见下

# 假设我们定义了两种支付方式,分别为支付宝和微信,class Alipay:'''支付宝支付'''def pay(self,money):print('支付宝支付了%s元'%money)class Applepay:'''apple pay支付'''def pay(self,money):print('apple pay支付了%s元'%money)ali = Alipay()print(ali.pay(100))
apy = Applepay()print(apy.pay(100))

# 一般情况下,为了调用方便,我们一般会统一一个支付调用的方式,上面的调用虽然可以解决问题,但是不方便 

def pay(payment,money):
    '''支付函数,总体负责支付对应支付的对象和要支付的金额'''payment.pay(money)

p = Alipay()
pay(p,200)

# 但是当我们又有新的支付方式进来,而且这些新的支付方式不是同一个人开发的,在不知道类中的函数名字都是pay命名的时候# 就容易出错,如下面这样:

class Alipay:'''支付宝支付'''def pay(self,money):print('支付宝支付了%s元'%money)class Applepay:'''apple pay支付'''def pay(self,money):print('apple pay支付了%s元'%money)class Wechatpay:def fuqian(self,money):'''实现了pay的功能,但是名字不一样'''print('微信支付了%s元'%money)def pay(payment,money):'''支付函数,总体负责支付对应支付的对象和要支付的金额'''payment.pay(money)p = Wechatpay()
pay(p,200)   #此时执行pay函数就会报错,因为Wechatpay类中的函数不是以pay命名的,且这种报错不好分析

为了解决这种问题,可以自己主动设置一个报错机制,定义一个父类

# 接口初成:手动报异常:NotImplementedError来解决开发中遇到的问题class Payment:def pay(self):raise NotImplementedErrorclass Wechatpay(Payment): # 这里继承了Payment这个类def fuqian(self,money):print('微信支付了%s元'%money)p = Wechatpay()  #这里不报错
pay(p,200)      #这里报错了

可以在继续优化,写成下面这种形式,借用abc模块来实现接口

from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):  # 元类 默认的元类 type,说明要写一个规范类@abstractmethod  # 装饰器,作用就是来实现一个规范类,用来规范子类def pay(self,money):pass   # 没有实现这个方法class Wechatpay(Payment):def fuqian(self,money): # 这里修改成pay(self,money)就不会报错了print('微信支付了%s元'%money)p = Wechatpay() #不调就报错了,这样在执行这里的就是就报错了,会告诉哪里出错

实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

内容参考:https://www.cnblogs.com/Eva-J/articles/7293890.html

接口提取了一群类共同的函数,可以把接口当做一个函数的集合。然后让子类去实现接口中的函数。这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样

# tiger 走路 游泳
# swan 走路 游泳 飞
# oldying 走路 飞
from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):@abstractmethoddef swim(self):pass # 此处的函数只是一个规范,不执行class Walk_Animal(metaclass=ABCMeta):@abstractmethoddef walk(self):passclass Fly_Animal(metaclass=ABCMeta):@abstractmethoddef fly(self):passclass Tiger(Walk_Animal,Swim_Animal):  # 这里下面必须要写上上面继承规范类里面的功能def walk(self):passdef swim(self):pass
class OldYing(Fly_Animal,Walk_Animal):pass
class Swan(Swim_Animal,Walk_Animal,Fly_Animal):pass# 接口类  刚好满足接口隔离原则 面向对象开发的思想 规范,功能应该要隔离开来,需要哪个功能继承哪个功能

抽像类

import abc #利用abc模块实现抽象类class All_file(metaclass=abc.ABCMeta):all_type='file'@abc.abstractmethod #定义抽象方法,无需实现功能def read(self):'子类必须定义读功能'with open('filaname') as f:pass@abc.abstractmethod #定义抽象方法,无需实现功能def write(self):'子类必须定义写功能'passclass Txt(All_file): #子类继承抽象类,但是必须定义read和write方法def read(self):print('文本数据的读取方法')def write(self):print('文本数据的读取方法')class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法def read(self):print('硬盘数据的读取方法')def write(self):print('硬盘数据的读取方法')class Process(All_file): #子类继承抽象类,但是必须定义read和write方法def read(self):print('进程数据的读取方法')def write(self):print('进程数据的读取方法')wenbenwenjian=Txt()yingpanwenjian=Sata()jinchengwenjian=Process()#这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)# 抽象类 : 规范
# 一般情况下 单继承 能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现,把一些共同的功能提取出来。
# 多继承的情况 由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中# 抽象类还是接口类 : 面向对象的开发规范 所有的接口类和抽象类都不能实例化
# java :
# java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
# 但对于多继承的需求,由于java本身语法的不支持,所以创建了接口Interface这个概念来解决多继承的规范问题# python
# python中没有接口类  :接口类可以多继承#  python中自带多继承 所以我们直接用class来实现了接口类,模拟了Java的接口的概念。
# python中支持抽象类  : 一般情况下 单继承  不能实例化,因为它是用来抽象出来一个共同的功能#  且可以实现python代码

封装

# 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
# 只让自己的对象能调用自己类中的方法# 狭义上的封装 —— 面向对象的三大特性之一
# 属性 和 方法都藏起来 不让你看见
class Person:__key = 123  # 私有静态属性def __init__(self,name,passwd):self.name = nameself.__passwd = passwd   # 私有属性,双下划线,不想让别人调出来看见,只是代码保护,并不是保护数据的机制def __get_pwd(self):         # 私有方法return self.__passwd   #只要在类的内部使用私有属性,就会自动的带上_类名,且只有在内部才有私有属性和方法def login(self):          # 正常的方法调用私有的方法self.__get_pwd()alex = Person('alex','alex3714')
print(alex._Person__passwd)   # _类名__属性名
print(alex.get_pwd())# 所有的私有 都是在变量的左边加上双下划綫# 对象的私有属性# 类中的私有方法# 类中的静态私有属性
# 所有的私有的 都不能在类的外部使用

转载于:https://www.cnblogs.com/zheng1076/p/11091171.html

Python学习笔记25:接口类、抽象类和封装相关推荐

  1. JAYのpython学习笔记——对象和类

    为对象定义类 类定义对象的特征和行为 python会在运行时为每个对象赋予一个独特的id来辨识这个对象 数据域:即变量or实例变量,用于描述对象的状态,例如圆的radius,矩形的height和wid ...

  2. python学习笔记-为自定义类或者函数编写help文档,以及进行文档测试

    在python中我们可以利用help("模块名")或者help(类名)的方式来查看类或者函数的文档.但是它们是如何编写的呢? 其实它们在类最前面或者方法的最前面用"&qu ...

  3. Python学习笔记之五:类定义

    这里,我定义了一个类,初始化函数,Show函数,并且定义了文档字符串,使用了help函数和__doc__来调用文档字符串 >>> class FooClass(object):&qu ...

  4. Python学习笔记28:从协议到抽象基类

    Python学习笔记28:从协议到抽象基类 今后本系列笔记的示例代码都将存放在Github项目:https://github.com/icexmoon/python-learning-notes 在P ...

  5. Python设计模式二:接口类和抽象类(Python接口设计)

    系列文章目录 Python设计模式一:面向对象编程 文章目录 系列文章目录 前言 一.接口类和抽象类是什么? 基于接口编程而非实现 二.Python里如何实现接口类和抽象类? 三.接口类和抽象类的应用 ...

  6. Python学习笔记:创建分数类

    Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...

  7. Python学习笔记 (类与对象)

    Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...

  8. Python学习笔记(九):类和对象

    Python学习笔记(九):类和对象 关于类和对象 Python学习笔记(九):类和对象 一.类和对象 类的定义 类的实例化 类对象的使用 二.self用法 三.类方法 实例方法 类方法 静态方法 静 ...

  9. Python学习笔记16:实操案例十三(编写程序实现乐手弹奏乐器,设计自定义类表达出租车和家用轿车信息)

    Python学习笔记16:实操案例十三(编写程序实现乐手弹奏乐器,设计自定义类表达出租车和家用轿车信息) 1.编写程序实现乐手弹奏乐器 注意Python的多态是"鸭子类型",只要有 ...

  10. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并

    OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...

最新文章

  1. 压缩文件夹_怎样压缩文件夹并发送
  2. Py之GUI:Python下各种GUI(图形用户界面)简介、使用优缺点对比
  3. boost::geometry::model::multi_point用法的测试程序
  4. python mro c3_python的MRO和C3算法
  5. 持续集成工具集之三 Jenkins配置
  6. java中logger关闭log_Log4J如何关闭Logger对象的IO流资源
  7. p2093 [国家集训队]JZPFAR
  8. 并发编程常见面试题总结二
  9. 关于c语言图书管理系统的ppt,课件C语言图书管理系统代码.doc
  10. COMSOL光纤建模、光子带隙分析等
  11. 如何利用linux解除手机bl锁,小米手机解BL锁教程(小米手机详细图文详解解锁Bootloader教程)...
  12. 网页右下角3秒自动弹出悬浮在线客服代码
  13. bochs+linux可上网版,bochs win7镜像可
  14. 阿里国际站店铺首页装修效果动画滚动代码生成器免费如何装修店铺全屏代码滚动效果特效动效全屏轮播滚动
  15. unity3d射击类demo
  16. 钣金展开更自由了? SOLIDWORKS 2022 新功能
  17. cerr与cout心得
  18. java 搭建http服务器_搭建简单的HTTP服务器
  19. 2016各大公司智力题和找规律题
  20. Google Colaboratory中有多个py文件时的使用技巧

热门文章

  1. python日期模块datetime常用操作总结(字符串与datetime对象互转、日期差值计算、时间戳获取、时间数组生成等)
  2. 深度学习软件资源列表
  3. java接口的关键字_java关键字-interface
  4. 复旦大学计算机a类专业,如何看待浙大A类学科39个,全国第一,录取分却比复旦、上交低?...
  5. 如何获取Class类对象?
  6. 微信小程序云开发教程-微信小程序的JS高级-页面间数据传递
  7. linux xfs 字体服务,Linux下Python和Tkin的字体管理
  8. html同时用多个css,多类选择器的运用_html/css_WEB-ITnose
  9. Servlet和Tomcat底层分析
  10. SourceTree 密码填写正确但是拉取显示密码错误解决