根据Java的说法,抽象类是以abstract为关键字声明的类,类内部既可以有抽象方法,也可以有一般方法。
抽象类是对某类具有相似特征的对象进行的抽取,提炼出共性而存在。(如:Cat类和Dog类可抽象出Animal类)
接口是对某一类行为的抽取,对此类行为提取出共性,由各个实现类负责具体方法。(如:Cat会跑,Dog会跑,可抽象出Run接口)
抽象类:内部方法可实现也可交由子类实现
接口:内部方法只能由实现类去实现
Python没有抽象类和接口之分,统一为抽象类,由abc模块实现此功能
抽象方法有两种实现方式:@classmethod或者@abc.abstractmethod,其余方法不推荐
# 抽象类
import abc
class Animal(metaclass=abc.ABCMeta):
@classmethod
def name(self,name):
pass
class Cat(Animal):
def name(self, name):
print('我叫:' + name)
if __name__ == '__main__':
Cat().name('huahua')
多继承:Java不支持多继承,为了弥补,只能以接口来间接实现多继承,Python直接支持多继承,
形如 class Child(Super1,Super2,···)
多继承的顺序问题:
若Super1与Super2里面有重名方法,到底哪个有效?
优先调用顺序靠前的类的方法,这点要注意。
具体可看下面例子:
class Father(object):
def hair(self):
print ('no hair')
class Mom(object):
def hair(self):
print ('hair')
class Tom(Father,Mom):
pass
me=Tom()
me.hair()
class Tom(Mom,Father):
pass
me=Tom()
me.hair()
Mixin类名规范:
但是,Java的抽象类和接口有各自的分工(抽象类用于对物的抽象,接口用于对行为的抽象),而Python在多继承时将抽象类和接口的分工混为一谈,使类的层次结构出现混乱。为了解决这个难题,Python引入了Mixin的概念,对行为类可以用“类名+Mixin”的命名方式来作区分,如(FlyMixin或RunMixin),这样的话,只要看到以MIxin结尾的继承类就知道其功能类似于接口了。
如果不明白的话,请看下面文章:
https://www.liaoxuefeng.com/wiki/897692888725344/923030524000032