热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python封装函数接口_Python学习笔记25:接口类、抽象类和封装

接口类、抽象类和封装都是和类相关的一些知识概念。接口类在说明什么是接口类之前我们先来引入一个问题,见下#假设我们定义了两种支付方式,分别为支付宝和微信&

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

接口类

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

# 假设我们定义了两种支付方式,分别为支付宝和微信,

classAlipay:'''支付宝支付'''

defpay(self,money):print('支付宝支付了%s元'%money)classApplepay:'''apple pay支付'''

defpay(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命名的时候

# 就容易出错,如下面这样:

classAlipay:'''支付宝支付'''

defpay(self,money):print('支付宝支付了%s元'%money)classApplepay:'''apple pay支付'''

defpay(self,money):print('apple pay支付了%s元'%money)classWechatpay:deffuqian(self,money):'''实现了pay的功能,但是名字不一样'''

print('微信支付了%s元'%money)defpay(payment,money):'''支付函数,总体负责支付

对应支付的对象和要支付的金额'''payment.pay(money)

p=Wechatpay()

pay(p,200) #此时执行pay函数就会报错,因为Wechatpay类中的函数不是以pay命名的,且这种报错不好分析

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

# 接口初成:手动报异常:NotImplementedError来解决开发中遇到的问题

classPayment:defpay(self):raiseNotImplementedErrorclassWechatpay(Payment): # 这里继承了Payment这个类deffuqian(self,money):print('微信支付了%s元'%money)

p= Wechatpay() #这里不报错

pay(p,200) #这里报错了

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

from abc importabstractmethod,ABCMetaclass Payment(metaclass=ABCMeta): #元类 默认的元类 type,说明要写一个规范类

@abstractmethod #装饰器,作用就是来实现一个规范类,用来规范子类

def pay(self,money):pass #没有实现这个方法

classWechatpay(Payment):deffuqian(self,money): # 这里修改成pay(self,money)就不会报错了print('微信支付了%s元'%money)

p= Wechatpay() #不调就报错了,这样在执行这里的就是就报错了,会告诉哪里出错

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

继承的第二种含义非常重要。它又叫“接口继承”。

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

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

接口提取了一群类共同的函数,可以把接口当做一个函数的集合。

然后让子类去实现接口中的函数。

这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。

归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。

比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。

再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样

#tiger 走路 游泳#swan 走路 游泳 飞#oldying 走路 飞

from abc importabstractmethod,ABCMetaclass Swim_Animal(metaclass=ABCMeta):

@abstractmethoddef swim(self):pass #此处的函数只是一个规范,不执行

class Walk_Animal(metaclass=ABCMeta):

@abstractmethoddef walk(self):pass

class Fly_Animal(metaclass=ABCMeta):

@abstractmethoddef fly(self):pass

class Tiger(Walk_Animal,Swim_Animal): #这里下面必须要写上上面继承规范类里面的功能

defwalk(self):pass

defswim(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#定义抽象方法,无需实现功能

defread(self):'子类必须定义读功能'with open('filaname') as f:pass@abc.abstractmethod#定义抽象方法,无需实现功能

defwrite(self):'子类必须定义写功能'

pass

class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法

defread(self):print('文本数据的读取方法')defwrite(self):print('文本数据的读取方法')class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法

defread(self):print('硬盘数据的读取方法')defwrite(self):print('硬盘数据的读取方法')class Process(All_file): #子类继承抽象类,但是必须定义read和write方法

defread(self):print('进程数据的读取方法')defwrite(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代码

封装

#广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种#只让自己的对象能调用自己类中的方法

#狭义上的封装 —— 面向对象的三大特性之一#属性 和 方法都藏起来 不让你看见

classPerson:__key = 123 #私有静态属性

def __init__(self,name,passwd):

self.name=name

self.__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())#所有的私有 都是在变量的左边加上双下划綫

#对象的私有属性

#类中的私有方法

#类中的静态私有属性#所有的私有的 都不能在类的外部使用



推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
author-avatar
笑点已阵亡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有