037.Python面向对象_关于抽象类和抽象方法

2023-12-14 15:09:10

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 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()
    

文章来源:https://blog.csdn.net/weixin_50296259/article/details/134918535
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。