【Python】抽象类与接口

根据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

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值