一步一步学python之(16)面向对象(抽象类和接口)

一步一步学python之(16)面向对象(抽象类和接口)

在Python中,抽象类和接口是用于定义类的规范和约束的机制,它们不能被实例化,只能被继承和实现。抽象类可以包含具体的方法和属性,但是至少有一个抽象方法。抽象类用于定义一组相关的类的公共接口供子类继承,子类必须实现抽象方法。
接口是一个纯粹的抽象类,它只定义了一组抽象方法,没有具体的方法实现和属性。接口用于定义子类的行为规范,子类必须实现接口中定义的所有方法。
在Python中,可以使用abc模块来定义抽象类,抽象方法必须用abstractmethod来装饰。

1. 抽象类

**抽象类可以包含具体的方法和属性,但是至少有一个抽象方法。**抽象类用于定义一组相关的类的公共接口供子类继承,子类必须实现抽象方法。抽象类用于定义一组相关的类的公共接口供子类继承,子类必须实现抽象方法。相当于给方法指定了一套规则(方法名称和参数都指定好了)
如何创建抽象类和抽象方法呢?
导入abc模块:首先,你需要从abc模块导入ABC和abstractmethod。
定义抽象基类:通过继承ABC类来创建抽象基类(继承上一节内容我们都已经介绍过了)。
定义抽象方法:使用@abstractmethod装饰器来标记抽象方法,用法感觉和java中的注解方式差不多。

from abc import ABC, abstractmethod
class Animal(ABC):
    @abstractmethod
    def jiao_sheng(self):
        pass
class Dog(Animal):
    def jiao_sheng(self):
        return "汪汪!"
class Cat(Animal):
    def jiao_sheng(self):
        return "喵喵!"

# animal = Animal()  # 这将抛出,说明不能创建抽象类的实例
dog = Dog()
print(dog.jiao_sheng())
cat = Cat()
print(cat.jiao_sheng())

在上面的例子中,Animal是一个抽象基类,它定义了一个抽象方法jiao_sheng(汉语拼音O(∩_∩)O哈哈~)。Dog和Cat类继承自Animal并提供了jiao_sheng方法的具体实现。如果我们尝试直接实例化Animal,将会抛出TypeError,因为它是抽象的,不能被实例化。
指导了抽象类我们来总结下 和我们上节部分介绍的普通的类有什么区别呢?相信你已经非常清楚了。

特性抽象类普通类
是否可以实例化
方法类型要求可包含抽象方法和具体方法仅包含具体方法,不能包含抽象方法
子类要求子类必须实现父类中所有抽象方法无要求

2.接口

在python中,其实抽象类和接口没有严格的定义区分,其实接口也可以通过抽象类变相的表示,比如抽象类中有且仅有抽象方法时就可以看做是一个接口。如果抽象类中还有具体的方式是,就不能看做这接口,直白一点就是,接口中的所有方法必须都是抽象的,而抽象类中至少有一个抽象方法,可以有任意个具体的方法。

例如定义一个接口如下:

from abc import ABC, abstractmethod
 
class IShape(ABC):
    @abstractmethod
    def area(self):
        pass
 
    @abstractmethod
    def perimeter(self):
        pass

接口中的两个方法都是抽象的(@abstractmethod修饰),并且没有具体实现的方法,所以可以认为就是一个接口。

更加详细抽象类内容介绍可以参考官网的abc — 抽象基类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛百米冲刺

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值