ITPub博客

首页 > 数据库 > 数据库开发技术 > python面向对象编程篇(5):抽象类的理解

python面向对象编程篇(5):抽象类的理解

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-12 17:59:38 0 删除 编辑

本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。

个人其他博客地址:

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

1.关于接口

以前学习java的时候我们的,知道java有接口的概念,通过接口的概念,我们的可以实现java的多态,因为java不支持多层继承,而我们的python支持多层继承,java多态的我实现是依赖于我们的接口,在Go言语中也意义有接口,和java类似。

如java接口示例:

public interface Run {
public void run();//跑
}
public interface Eat {
public void eat();//吃
}
public class Ren implements Run,Eat {
    public void run() {
                System.out.println("必须实现跑函数");
        }
     public void eat() {
                System.out.println("必须实现吃函数");
        }
}

但是在python里我们没有接口概念,那如何实现类似接口的多态呐?这时候需要我们使用Python内置的abc模块,来实现相关类似java中的抽象类和抽象函数了!

2.关于抽象类

我们知道类是对虚拟世界物体的一些属性和方法的封装。那反过来我们需要对类进行一些方法的封装的话,如何实现呐?

所以抽象类的出现其实就是类似把类的一些公共的方法进行封装,大事这些抽象出来的公共的方法很特殊,它不能进行实现,只能给被继承的对象进行实现,而且继承的对象也必须实现,这个抽象类的方法。

抽象类的定义,抽象类是也一个类,但是它是一个特殊的类,特殊在于这个不能进行实例化,只能被用于继承。

在python中主要是利用abc模块实现抽象类。

实现抽类的关键元素有:

  • class 类需继承的 abc.ABC 即为抽象类
  • @abstractmethod 装饰器装饰的函数 即为抽象函数

我们来看下面的一个示例:

2.1类不能被实例化的验证

import abc
class Ape(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def eat(self):
        pass

asas  = Ape()
asas.eat()

上面的代码运行后会报错:

Traceback (most recent call last):
  File "D:/code/python/local_python/AntFlask/ceshi3.py", line 9, in <module>
    asas  = Ape()
TypeError: Can't instantiate abstract class Ape with abstract methods eat

2.2 继承类必须不实现抽象类的方法的报错验证

# -*- coding:utf-8 -*-

import abc
class Ape(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def eat(self):
        pass

 #超级赛亚人形态1
class Saiyaren1(Ape):



    def talk(self):
        print('说话:我是超级赛亚人第1形态')

#超级赛亚人形态2
class Saiyaren2(Ape):
    def talk(self):
        print('说话:我是超级赛亚人第2形态')


a =  Saiyaren1()
a.talk()

上面,因为我们的没有实现我们的Ape抽象类里面的eat的方法。运行上面的代码的时候回报错:

Traceback (most recent call last):
  File "D:/code/python/local_python/AntFlask/ceshi3.py", line 24, in <module>
    a =  Saiyaren1()
TypeError: Can't instantiate abstract class Saiyaren1 with abstract methods eat

2.3 继承类实现抽象类的方法后正常运行的验证


import abc
class Ape(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def eat(self):
        pass

 #超级赛亚人形态1
class Saiyaren1(Ape):

    def eat(self):
        print('吃饭:我是超级赛亚人第1形态')

    def talk(self):
        print('说话:我是超级赛亚人第1形态')

#超级赛亚人形态2
class Saiyaren2(Ape):
    def talk(self):
        print('说话:我是超级赛亚人第2形态')


a =  Saiyaren1()
a.talk()

输出的结果为:

说话:我是超级赛亚人第1形态

3.抽象类的作用

规范子类,归一化管理.


import abc
class Ape(metaclass=abc.ABCMeta): #同一类族群

    name = "我们都是超级赛亚人一族"

    @abc.abstractmethod
    def eat(self):
        pass

 #超级赛亚人形态1
class Saiyaren1(Ape):

    def eat(self):
        print('吃饭:我是超级赛亚人第1形态')

    def talk(self):
        print('说话:我是超级赛亚人第1形态')

#超级赛亚人形态2
class Saiyaren2(Ape):

    def eat(self):
        print('吃饭:我是超级赛亚人第2形态')

    def talk(self):
        print('说话:我是超级赛亚人第2形态')


a =  Saiyaren1()
a.talk()
a.eat()
print("a我是谁:",a.name)

b =  Saiyaren2()
b.talk()
b.eat()
print("b我是谁:",b.name)

输出:

说话:我是超级赛亚人第1形态
吃饭:我是超级赛亚人第1形态
a我是谁: 我们都是超级赛亚人一族
说话:我是超级赛亚人第2形态
吃饭:我是超级赛亚人第2形态
b我是谁: 我们都是超级赛亚人一族

以上是个人对Python的抽行类的简要阐述。

End

纯属个人实践中相关经验阐述总结,如有纰漏,还希望大佬们多多提点!小钟同学 | 文  【原创】| QQ:308711822


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111708