多态
what: 同一个事物有不同的形态。
多态的目的:在不知道对象具体类型的情况下,统一对象调用方法的规范。(通俗讲,即规定实现同样功能的方法,一定要起同样的名字)。
多态的表现形式之一就是继承,先抽象再继承。
多态的父类:定制一套统一的规范,子类中重写该方法,并使用这个方法名。
python中不会强制限制子类一定要用父类规定的方法名,所以出现了抽象类。
抽象类
what:python中内置了abc模块中有抽象类 import abc
抽象类的作用:让子类必须遵循父类的编写规范。
如何实现抽象类:请看代码
# _*_ coding: gbk _*_ # @Author: Wonder import abc class Father(metaclass=abc.ABCMeta): # 定义时候要加上metaclass = abc.ABCMeta @abc.abstractmethod # 被@abc.abstractmethod装饰的方法,必须在子类中重写,否则会报错。 def bark(self): print('barking......') @abc.abstractmethod def run(self): print('running......') def dance(self): print('dancing......') class Sub(Father): def poke(self): print('poking......') def bark(self): # 重写父类方法,不写会报错 print('sub barking......') def run(self): print('sub running......') test = Sub() test.run() test.bark() test.dance() test.poke()
注意点:1.父类名后要加上 classmeta = abc.ABCMeta 2.父类方法上要加上@abc.abstractmethod 3.子类务必遵循父类方法的编写规范进行重写,缺一不可。
鸭子类型
鸭子类型是多态的一种表现形式。
针对不同的对象,根据特点先抽象出相同的方法,再制定一套统一的编写规范
在定义类时,类中的方法都按照统一的规范进行编写。
鸭子类型取消了继承,也取消了抽象类,全凭自觉按照规范编写。这样耦合度就很低。
鸭子类型可以封装出若干个统一的对外的接口,调用相似事物的相同方法,例如:
# _*_ coding: gbk _*_ # @Author: Wonder class Dog: def bark(self): print('dog barking') class Cat: def bark(self): print('cat barking') class Bird: def bark(self): print('bird barking') def BARK(animal): # 封装统一对外接口 animal.bark() dog = Dog() cat = Cat() bird = Bird() BARK(dog) BARK(cat) BARK(bird)
总结:
多态的三种表现形式:
>>>继承父类 中度耦合(父类给了规范,但子类可以自由发挥,不用父类的规范)
>>>继承抽象类 高耦合(父类给了规范,并严格限制子类按照规范重写override)
>>>鸭子类型 低耦合(没有继承,类中的方法名 全凭自觉 按照规范编写)
绑定方法classmethod和非绑定方法staticmethod
classmethod和staticmethod都是pyhton内置的装饰器
classmethod用来标识 类中的某个方法是类的绑定方法。由类来调用,自动传入方法的第一个参数是类。
之前学过类中不加修饰的方法是对象的绑定方法,对象调用这些方法时,会将自身作为第一个参数传入方法,当成self。