derezzed

导航

python面向对象三大特性之继承(接口类)

'''
接口类

继承有两种用途:

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

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

'''


# class Alipay:
#     '''
#     支付宝支付
#     '''
#     def pay(self,money):
#         print('支付宝支付了%s元'%money)
#
# class Applepay:
#     '''
#     apple pay支付
#     '''
#     def pay(self,money):
#         print('apple pay支付了%s元'%money)
#
#
# def pay(payment,money):
#     '''
#     支付函数,总体负责支付
#     对应支付的对象和要支付的金额
#     '''
#     payment.pay(money)
#
#
# p = Alipay()
# pay(p,200)


# 开发中容易出现的问题


# class Alipay:
#     '''
#     支付宝支付
#     '''
#     def pay(self,money):
#         print('支付宝支付了%s元'%money)
#
# class Applepay:
#     '''
#     apple pay支付
#     '''
#     def pay(self,money):
#         print('apple pay支付了%s元'%money)
#
# class Wechatpay:
#     def fuqian(self,money):
#         '''
#         实现了pay的功能,但是名字不一样
#         '''
#         print('微信支付了%s元'%money)
#
# def pay(payment,money):
#     '''
#     支付函数,总体负责支付
#     对应支付的对象和要支付的金额
#     '''
#     payment.pay(money)
#
#
# p = Wechatpay()
# pay(p,200)   #执行会报错


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

'''
class Payment:
    def pay(self):
        raise NotImplementedError

class Wechatpay(Payment):
    def fuqian(self,money):
        print('微信支付了%s元'%money)

def pay(payment,money):
    payment.pay(money)

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

'''


# 借用abc模块来实现接口

'''
from abc import ABCMeta,abstractmethod

class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self,money):
        pass


class Wechatpay(Payment):
    def fuqian(self,money):
        print('微信支付了%s元'%money)

p = Wechatpay() #不调就报错了
'''


# 实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。
#
# 继承的第二种含义非常重要。它又叫“接口继承”。
# 接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,
# 可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。
#
# 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,
# 不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,
# 然后做出针对性的设计:细致到什么程度,视需求而定)。
#
# 依赖倒置原则:
# 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程
#
# 在python中根本就没有一个叫做interface的关键字,上面的代码只是看起来像接口,其实并没有起到接口的作用,子类完全可以不用去实现接口 ,
# 如果非要去模仿接口的概念,可以借助第三方模块:
# 在python中根本就没有一个叫做interface的关键字,上面的代码只是看起来像接口,
# 其实并没有起到接口的作用,子类完全可以不用去实现接口 ,如果非要去模仿接口的概念,可以借助第三方模块:
#
# http://pypi.python.org/pypi/zope.interface
#
# twisted的twisted\internet\interface.py里使用zope.interface
#
# 文档https://zopeinterface.readthedocs.io/en/latest/
#
# 设计模式:https://github.com/faif/python-patterns

# 为何要用接口

# 接口提取了一群类共同的函数,可以把接口当做一个函数的集合。
#
# 然后让子类去实现接口中的函数。
#
# 这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。
#
# 归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。
#
# 比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,
# 由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。
#
# 再比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,
# 他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,
# 开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样

 

posted on 2018-01-18 16:56  derezzed  阅读(249)  评论(0)    收藏  举报