【Python】抽象类与接口

本文对比了Java和Python中抽象类与接口的差异。Java中抽象类和接口有明确分工,抽象类可含抽象和一般方法,接口方法由实现类实现。Python无二者之分,统一为抽象类,由abc模块实现。Python支持多继承,为解决层次结构混乱引入Mixin概念。
部署运行你感兴趣的模型镜像

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

 

 

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

抽象类接口都是面向对象编程中的概念,用于描述一种类型或者类的行为。在 Python 中,抽象类接口的实现方式有所不同。 抽象类是一个包含抽象方法的类,抽象方法是一种没有具体实现的方法,只有方法名和参数列表,没有函数体。抽象类的目的是为了让子类去实现这些抽象方法,并且强制子类必须实现这些方法。在 Python 中,可以通过 abc 模块来实现抽象类。示例代码如下: ```python from abc import ABC, abstractmethod class MyAbstractClass(ABC): @abstractmethod def my_abstract_method(self): pass class MyConcreteClass(MyAbstractClass): def my_abstract_method(self): print("MyConcreteClass's implementation of my_abstract_method") my_object = MyConcreteClass() my_object.my_abstract_method() ``` 接口是一个约定,它描述了一个类应该具有哪些方法,但是并不关心这些方法的实现方式。接口中的方法都是抽象的,没有具体实现。在 Python 中,没有专门的接口语法,但是可以通过多重继承和抽象类来实现接口。示例代码如下: ```python class MyInterface1(ABC): @abstractmethod def my_interface_method1(self): pass class MyInterface2(ABC): @abstractmethod def my_interface_method2(self): pass class MyConcreteClass(MyInterface1, MyInterface2): def my_interface_method1(self): print("MyConcreteClass's implementation of my_interface_method1") def my_interface_method2(self): print("MyConcreteClass's implementation of my_interface_method2") my_object = MyConcreteClass() my_object.my_interface_method1() my_object.my_interface_method2() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值