热门标签 | 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

第二十五天接口、多态


推荐阅读
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
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社区 版权所有