我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
关于抽象类和抽象方法
抽象类和抽象方法
概念
- 抽象类:一种特殊的类,只能被继承,不能被实例化,创建实例会报错
- 抽象方法:一个抽象出来的方法,不具备具体实现,不能直接调用,子类必须实现这个方法,否则会报错
- 抽象类与普通类的不同之处在于:抽象类必须包含一个或多个抽象方法,也可以包含普通方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法
为什么要抽象类和抽象方法
- 抽象类: 比如需要创建Dog类、Cat类、Chick类(一些具体的动物类),那么就可以创建一个Animal类把这些具体的动物类共有的一些特性放到这个Animal类当中。但是,这个Animal类实例化出来的对象又没有什么具体的含义(实例化的一个对象就是一个动物,但是又不能体现是什么具体的动物),此时,我们就可以把这个Animal类设计成一个抽象类
- 抽象方法: 这些具体的动物对象都会有一些必须的特性(比如:叫、吃、跑…),那么,我们在定义这些具体的动物类的时候,就必须去实现这些特性的方法。我们就可以在父类Animal中将这些特性方法设计成一个抽象方法,父类不需要去具体实现这些方法,但是子类必须实现
抽象类的作用
- 1、定义接口:抽象类可以定义一组方法或属性作为接口,子类必须实现这些方法或属性。通过定义接口,可以确保子类具有必要的方法和属性,并且遵循一定的行为规范。
- 2、规范子类的行为:抽象类可以定义一些默认的方法实现,子类可以选择性地继承或重写这些方法。通过规范子类的行为,可以保持代码的一致性,提高代码的可读性和可维护性。
- 3、防止实例化:抽象类不能直接实例化,只能用作父类。这样可以避免在抽象类中定义的接口或默认方法被误用
具体实现方法
- 无法直接支持,需要借助
abc
模块# 导入模块 import abc # 设置类的元类 <class Animal(object, metaclass=abc.ABCMeta)> abc.ABCMeta # 使用装饰器修饰 抽象方法 @abc.abstractmethod # 使用装饰器修饰 抽象类方法 @abc.abstractclassmethod # 使用装饰器修饰 抽象静态方法 @abc.abstractstaticmethod # 使用装饰器修饰 抽象属性 @abc.abstractproperty
- 示例
import abc class Animal(object, metaclass=abc.ABCMeta): @abc.abstractmethod def jiao(self): pass @abc.abstractclassmethod def run(cls): pass def eta(self): print(f'{self.name}吃东西') class Dog(Animal): def jiao(self): print('汪汪汪') @classmethod def run(cls): print("小狗会跑...") class Cat(Animal): def jiao(self): print('喵喵喵') @classmethod def run(cls): print("小猫会跑...") class Chick(Animal): def __init__(self): self.name = '小鸡' def jiao(self): print("叽叽叽") @classmethod def run(cls): print("小鸡会跑...") # a = Animal() # TypeError: Can't instantiate abstract class Animal with abstract method jiao xj = Chick() # TypeError: Can't instantiate abstract class Chick with abstract method jiao # xj.run() xj.eta()