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

第二十五天接口、多态

1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接

1.java是面向对象的语言。

设计模式:接口

接口类是从java里衍生出来的,不是python原生支持的  主要用于继承里多继承

抽象类是python原生支持的主要用于继承里的单继承

但是接口类和抽象类都是为了写程序时进行代码的规范化

2.第一个接口类程序的引入:即如果前面写了两个支付功能,来了三个程序员写但是支付功能与前两个写的方法名称不一样怎么进行查询:

技术图片技术图片
class Payment:
     def pay(self,money):
         raise NotImplemented  #主动抛异常,表示没有执行此方法
class Wetchat(Payment):
    def pay(self,money):
        print(我们使用微信支付了%s钱%money)
class Alipay(Payment):
    def pay(self,money):
        print(我们使用阿里支付了%s钱%money)
class Apple (Payment):
    def fuqian(self,money):
        print(apple我们使用阿里支付了%s钱%money)
def pay(obj_payment,money):  #定义此函数就不需要用户去指定哪一家去支付可以直接使用
    obj_payment.pay(money)
wechat=Wetchat()
ali=Alipay()
apple=Apple()
pay(wechat,100)
pay(ali,34)
pay(apple,35)#如果没有这一个pa方法第一个写的会报错
结果为
    pay(apple,35)
  File "D:/python练习程序/第二十五天/多态和继承.py", line 14, in pay
    obj_payment.pay(money)
  File "D:/python练习程序/第二十五天/多态和继承.py", line 3, in pay
    raise NotImplemented  #主动抛异常,表示没有执行此方法
TypeError: exceptions must derive from BaseException
View Code

3上面这个程序是可以查询出在类的定义中某个方法有错误但是不知道具体是哪一个类写了错误,可以使用一下方法进行改进:

技术图片技术图片
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):
    @abstractmethod  #加了这个装饰器就可查看到是哪一个类和规范写的不一致
    def pay(self,money):#元类默认的元类为type
         raise NotImplemented  #主动抛异常,表示没有执行此方法
class Wetchat(Payment):
    def pay(self,money):
        print(我们使用微信支付了%s钱%money)
class Alipay(Payment):
    def pay(self,money):
        print(我们使用阿里支付了%s钱%money)
class Apple (Payment):
    def fuqian(self,money):
        print(apple我们使用阿里支付了%s钱%money)
def pay(obj_payment,money):  #定义此函数就不需要用户去指定哪一家去支付可以直接使用
    obj_payment.pay(money)
wechat=Wetchat()
ali=Alipay()
apple=Apple()
pay(wechat,100)
pay(ali,34)
pay(apple,35)#如果没有这一个pa方法第一个写的会报错
结果为
  File "D:/python练习程序/第二十五天/多态和继承.py", line 19, in 
    apple=Apple()
TypeError: Cant instantiate abstract class Apple with abstract methods pay
View Code

4进行程序的规范化接口类和抽象类都可以

使用接口类进行多继承的例子演示:

技术图片技术图片
from abc import abstractmethod,ABCMeta
class Swin_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
class Walk_Animal:
    @abstractmethod
    def walk(self):
        pass
class Fly_Animal:
    @abstractmethod
    def fly(self):
        pass
class Tiger(Walk_Animal,Swin_Animal):
    def walk(self):
        pass
class OldYing(Fly_Animal,Walk_Animal):pass
class Swan(Swin_Animal,Walk_Animal,Fly_Animal):pass
ret=Tiger()
ret.swim()
View Code

5.接口隔离原则:

使用多个专门的接口,而不是单一的总接口。即客户端不应该依赖哪些不需要的接口。

6.抽象化的例子:记住系统中一切皆

技术图片技术图片
import  abc
class All_file(metaclass=abc.ABCMeta):
    all_type=file
    @abc.abstractmethod
    def read(self):
        子类必须定义读功能
        with open(filename)as f:
            pass
    @abc.abstractmethod
    def write(self):
        子类功能必须有写的功能
        pass
class Txt(All_file):
    def read(self):
        print(文本数据的读取方法:)
    def write(self):
        print(进行文本数据的写入方法:)
class Sata(All_file):
    def read(self):
        print(硬盘的数据读取方法)
    def write(self):
        print(硬盘的写入操作)
class Process(All_file):
    def read(self):
        print(进程数据的读取方法)
    def write(self):
        print(进行数据的写入方法:)
wenbenwenjian=Txt()
yingpanwenjian=Sata()
jinchengwenjian=Process()
print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
View Code

7。python天生支持多态:

8.那什么较多多态:就是指有些编程软件在进行数据传输的过程中需要进行类型的定义如果说在函数中定义的类型和传入的数据类型不一致,则会报错,需要写一个函数进行转换

但是python不需要。

9.paython里的数据类型属于动态强类型语言:鸭子类型。(两个类相似,并不会产生父类的子类之间的兄弟关系,就是鸭子类型)

10.看数据类型中的list和tuple

技术图片

多态的特点:松耦合:每个相似的类之间都没有什么影响。

          缺点:太随意靠自觉

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

12.狭义的封装:属性和方法都被隐藏起来,不让自己看到

技术图片技术图片
class Person:
    def __init__(self,name,passwd):
        self.name=name
        self.__passwd=passwd#对变量进行私有化
alex=Person(alex,alex1234)
print(alex.passwd)
结果为
Traceback (most recent call last):
  File "D:/python练习程序/第二十五天/多态和继承.py", line 81, in 
    print(alex.passwd)
AttributeError: Person object has no attribute passwd
View Code

13.那要怎么进行查看密码那:

技术图片技术图片
class Person:
    def __init__(self,name,passwd):
        self.name=name
        self.__passwd=passwd#对变量进行私有化
alex=Person(alex,alex1234)
print(alex.__dict__)  #查看对象的所有属性  可以发现私有属性只能通过类来查看
结果为
{name: alex, _Person__passwd: alex1234}
View Code

  所以使用方法为:

技术图片技术图片
class Person:
    def __init__(self,name,passwd):
        self.name=name
        self.__passwd=passwd#对变量进行私有化
alex=Person(alex,alex1234)
print(alex.__dict__)  #查看对象的所有属性  可以发现私有属性只能通过类来查看
print(alex._Person__passwd)  #调用私有属性的方法
结果为
{name: alex, _Person__passwd: alex1234}
alex1234
View Code

  方法二;

技术图片技术图片
class Person:
    def __init__(self,name,passwd):
        self.name=name
        self.__passwd=passwd#对变量进行私有化
    def get_passwd(self):
        return self.__passwd
alex=Person(alex,alex1234)
print(alex.__dict__)  #查看对象的所有属性  可以发现私有属性只能通过类来查看
print(alex._Person__passwd)  #调用私有属性的方法
print(alex.get_passwd())     #在类内部定义一个函数来取私有值:
结果为
{name: alex, _Person__passwd: alex1234}
alex1234
alex1234
View Code

14如果类被私有化之后应该怎们调用:

技术图片技术图片
class Person:
    def __init__(self,name,passwd):
        self.name=name
        self.__passwd=passwd#对变量进行私有化
    def get_passwd(self):
        return self.__passwd
    def __get(self):   #只要在类的方法前面加上双下划线就是蒋类里的方法进行私有化
        print(私有化被调用)
alex=Person(alex,alex1234)
print(alex.__dict__)  #查看对象的所有属性  可以发现私有属性只能通过类来查看
print(alex._Person__passwd)  #调用私有属性的方法
print(alex.get_passwd())     #在类内部定义一个函数来取私有值:
View Code

  通过上述代码我们可以发现下图:(我们无法调用get方法)

技术图片

15调用类中私有方法也是两种:

  方法一

技术图片技术图片
class Person:
    def __init__(self,name,passwd):
        self.name=name
        self.__passwd=passwd#对变量进行私有化
    def get_passwd(self):
        return self.__passwd
    def __get(self):   #只要在类的方法前面加上双下划线就是蒋类里的方法进行私有化
        print(私有化被调用)
alex=Person(alex,alex1234)
print(alex.__dict__)  #查看对象的所有属性  可以发现私有属性只能通过类来查看
print(alex._Person__passwd)  #调用私有属性的方法
print(alex.get_passwd())     #在类内部定义一个函数来取私有值:
alex._Person__get()
结果为
{name: alex, _Person__passwd: alex1234}
alex1234
alex1234
私有化被调用
View Code

  方法二:

技术图片技术图片
class Person:
    def __init__(self,name,passwd):
        self.name=name
        self.__passwd=passwd#对变量进行私有化
    def get_passwd(self):
        return self.__passwd
    def __get(self):   #只要在类的方法前面加上双下划线就是蒋类里的方法进行私有化
        print(私有化被调用)
    def get_get(self):
        self.__get()
alex=Person(alex,alex1234)
print(alex.__dict__)  #查看对象的所有属性  可以发现私有属性只能通过类来查看
print(alex._Person__passwd)  #调用私有属性的方法
print(alex.get_passwd())     #在类内部定义一个函数来取私有值:
alex._Person__get()  #使用对象.类进行指向私有方法
alex.get_get()
结果为
C:\pycharm\python.exe D:/python练习程序/第二十五天/多态和继承.py
{name: alex, _Person__passwd: alex1234}
alex1234
alex1234
私有化被调用
私有化被调用
View Code

第二十五天接口、多态


推荐阅读
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
  • 鼠标悬停出现提示信息怎么做
    概述–提示:指启示,提起注意或给予提醒和解释。在excel中会经常用到给某个格子增加提醒信息,比如金额提示输入数值或最大长度值等等。设置方式也有多种,简单的,仅为单元格插入批注就可 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • Android 6.0 切换指定 Wi-Fi 的解决方案
    本文详细介绍了在 Android 6.0 系统中切换到指定 Wi-Fi 的方法,包括常见的问题、原因分析及解决方案。通过官方文档和代码示例,帮助开发者更好地理解和实现这一功能。 ... [详细]
author-avatar
mobiledu2502880253
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有