python中类的多态-鸭子

python不支持多态,也不用支持多态,而是一种多态的语言。

 鸭子类型(duck typing):是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的集合决定,鸭子类型中关注的不是对象的类型本身,而是他如何使用。

  这个概念的名字来源于James Whitcomb Riley提出的鸭子测试:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。

  我们可以这样理解:在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。


一. 接口类

接口类不能被实例化

在python里没有接口类这种数据类型,没有接口类专门的语法
但是 可以通过继承abc模块实现接口的功能

复制代码
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):  # 接口类
    @abstractmethod
    def pay(self,money):
        pass
class Wechatpay(Payment):         # 根据接口类的规范编程
    def pay(self,money):
        print('微信支付了%s元'%money)
p = Wechatpay()
p.pay(6)
复制代码

二. 接口隔离原则

复制代码
from abc import ABCMeta,abstractmethod
class FlyAnimal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        print(11111)

class SwimAnimal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self): pass

class WalkAnimal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self): pass

class Swan(SwimAnimal,WalkAnimal,FlyAnimal):
    #
    def fly(self):pass
    # 游泳
    def swim(self):pass
    #
    def walk(self):pass

class Qq(SwimAnimal,WalkAnimal):
    def swim(self):pass
    #
    def walk(self):pass

class Bird(FlyAnimal,WalkAnimal):
    #
    def fly(self):pass
    #
    def walk(self):pass

Swan()
复制代码

三. 抽象类

抽象类 规范一个类的类
在python里 抽象类和接口类 没区别

在java里 有区别
java的接口规定里面的方法一定不能实现(一句代码也不能写)
抽象类 单继承


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

在python中,只要metaclass = ABCMeta 定义了抽象方法(@abctractmethod)
这个类就不能被实例化
你可以说他是一个抽象类

四. 多态

python是自带多态的

例如:上面的接口隔离原则就是多态

python崇尚鸭子类型

如:字符串,列表,元组,都是序列类型,但他们直接没有直接的继承关系

复制代码
class List:
    def index(self):
        pass
    def slice(self):
        pass
    def len(self):
        pass
    def append(self):
        pass
class Tuple:
    def index(self):
        pass
    def slice(self):
        pass
    def len(self):
        pass
class Str:
    def index(self):
        pass
    def slice(self):
        pass
    def len(self):
        pass
    def split(self):
        pass
复制代码

转自:http://www.cnblogs.com/zhuzhaoyang/p/8544567.html

猜你喜欢

转载自blog.csdn.net/runner668/article/details/80343261
今日推荐