首页 > 数据库 > 数据库开发技术 > python面向对象编程篇(5):抽象类的理解
本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
个人其他博客地址:
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
小钟同学 | 文 【原创】| QQ:308711822
以前学习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中的抽象类和抽象函数了!
我们知道类是对虚拟世界物体的一些属性和方法的封装。那反过来我们需要对类进行一些方法的封装的话,如何实现呐?
所以抽象类的出现其实就是类似把类的一些公共的方法进行封装,大事这些抽象出来的公共的方法很特殊,它不能进行实现,只能给被继承的对象进行实现,而且继承的对象也必须实现,这个抽象类的方法。
抽象类的定义,抽象类是也一个类,但是它是一个特殊的类,特殊在于这个不能进行实例化,只能被用于继承。
在python中主要是利用abc模块实现抽象类。
实现抽类的关键元素有:
我们来看下面的一个示例:
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
# -*- 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
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形态
规范子类,归一化管理.
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的抽行类的简要阐述。
纯属个人实践中相关经验阐述总结,如有纰漏,还希望大佬们多多提点!小钟同学 | 文 【原创】| QQ:308711822
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。