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

第二十五天接口、多态


推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 使用Jsoup解析并遍历HTML文档时,该库能够高效地生成一个清晰、规范的解析树,即使源HTML文档存在格式问题。Jsoup具备强大的容错能力,能够处理多种异常情况,如未闭合的标签等,确保解析结果的准确性和完整性。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 如何解决8080端口被占用问题
    本文介绍了如何通过命令行和任务管理器查找并终止占用8080端口的进程,以确保该端口能够正常使用。 ... [详细]
  • 本文详细介绍了如何在项目中引入和配置KindEditor网页编辑器,包括脚本引用、初始化编辑器以及文件上传功能的实现。 ... [详细]
  • 本文详细介绍了 HTML 中 a 标签的 href 属性的多种用法,包括实现超链接、锚点以及调用 JavaScript 方法。通过具体的示例和解释,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 近期,微信公众平台上的HTML5游戏引起了广泛讨论,预示着HTML5游戏将迎来新的发展机遇。磊友科技的赵霏,作为一名HTML5技术的倡导者,分享了他在微信平台上开发HTML5游戏的经验和见解。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
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社区 版权所有