码迷,mamicode.com
首页 > 编程语言 > 详细

Python 面向对象特性二 多态(3-7)

时间:2018-03-08 20:46:28      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:roman   声明   表格   play   log   error   hat   new   imp   

接口类:

继承有两种用途:

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)  

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

在Python中是没有接口的概念的(接口是在Java里的)

技术分享图片
from abc import ABCMeta,abstractmethod#调用abc模块中的抽象方法
# 接口类 : 接口类就是一个规范 接口类一般是项目设计人员写好的
class Payment(metaclass=ABCMeta):   #规范
    @abstractmethod
    def pay(self,money):
        ‘‘‘
        :param money:
        :return:
        ‘‘‘
        raise NotImplementedError

class ApplePay(Payment):# 100
    def pay(self,money):pass
app = ApplePay()
# 微信支付
# class WeChatPay(Payment):
#     def pay(self,money):
#         print(通过微信支付了%s元钱%(money))

# 支付宝支付
# class AliPay(Payment):
#     def pay(self,money):
#         print(通过支付宝支付了%s元钱%(money))

# apple pay
# class ApplePay(Payment): pass
    # def pay(self,money):
    #     print(通过支付宝支付了%s元钱 % (money))

# wp = WeChatPay()
# alp = AliPay()
# app = ApplePay()
# def pay(pay_obj,money): # 程序的归一化设计
#     pay_obj.pay(money)
# pay(alp,100)
# pay(wp,100)
# pay(app,100)
在Java里

接口类是一种规范,从上述代码可知,没一种支付方式都是一个类,每个类中定义一种支付方法完成功能,由于每个支付方法在程序中表现出来的就是支付类的对象,我们要拿到每一个支付方法,位了方便支付方法的调用,都需要统一一个入口。pay函数。因为在Python中没有节后类这种数据类型,没有接口类专门的语法,这时候我们可以继承abc模块实现接口的功能。

技术分享图片接口类开发原则

需要注意的是:接口类不能被实例化!

抽象类:

定义: 规范一个类的类  与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

与接口类的区别:

在Python中,抽象类和接口类没有区别
在java里 有区别:
java的接口类规定 类里面的方法一定不能实现(一句代码也不能写)
抽象类 是单继承
无论接口类 还是抽象类 其实都是一种面向对象编程的开发规范
只是在接口类或者抽象类中 去约束继承它的子类必须实现某些方法
对于java代码来说:如果发生多继承 那么一定是接口类 且里面的方法都不能实现
# 如果在方法里有了实现 那么一定是单继承 的抽象类
# 但是对于python来说 就没有这些约束
# 因为python没有接口的概念
# 对于类的继承 没有多继承的限制
# 实际上abc模块是帮我们实现抽象类的方法,只是我们用它来模仿接口类的效果了

在python中,只要metaclass = ABCMeta 定义了抽象方法(@abctractmethod)
# 这个类就不能被实例化
# 你可以说他是一个抽象类
技术分享图片
from abc import ABCMeta, abstractmethod
class File(metaclass=ABCMeta):
    @abstractmethod
    def read(self):
        f = open(file, r)
        self.f = f

    @abstractmethod
    def write(self):
        f = open(file, w)


class Word(File):
    def read(self):
        # 打开一个文件
        # 读文件
        # 关闭一个文件
        super().read()
        self.f.read()
        self.f.close()


class Excle(File):
    def read(self):
        # 打开一个文件
        # 读某一列  读某一列
        # 关闭一个文件
        super().read()
        self.f.readline()
        self.f.close()
class PPT(File):
    def read(self):
        # 打开一个文件
        # 读文字 读表格 读图片
        # 关闭一个文件
        super().read()
        self.f.readpicture()
        self.f.close()
抽象类

多态:所有的类都继承父类

Python是自带多态的(也可以理解为Python都是继承了object这个父类)
Python是一门动态强类型语言
技术分享图片
# class WeChatPay:
#     def pay(self,money):
#         print(通过微信支付了%s元钱%(money))
# class AliPay:
#     def pay(self,money):
#         print(通过支付宝支付了%s元钱%(money))
# def pay(pay_obj,money): # 程序的归一化设计
#     pay_obj.pay(money)
# w = WeChatPay()
# a = AliPay()
# pay(w,100)
多态

鸭子类型:将大致相同的属性归为一个父类,供子类调用

 

Java崇尚接口类,Python崇尚鸭子类型



 

Python 面向对象特性二 多态(3-7)

标签:roman   声明   表格   play   log   error   hat   new   imp   

原文地址:https://www.cnblogs.com/yimiflh/p/8528429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!