抽象类
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
补充:
1.在python中并没有interface这个关键字来声明这是个接口,如果非要模仿接口的概念就用到了第三方模块,比如:abs模块。
2.接口就是只定义了一些方法,而没有实现。【(这些方法被称为抽象方法),在一个方法中直接写了一个pass就是没有实现任何功能的方法,就叫做抽象方法】
3含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法,此时也没有任何意义了。
注意: 在python中,我们不以有无执行体来区分是否是抽象类,而是根据是否有@abc.abstractmethod装饰器作为标准。
抽象类是包含抽象方法的类,而抽象方法不包含任何可实现的代码,只能在其子类中实现抽象函数的代码。不能直接实例化抽象类!!!
子类继承父类的成员变量和成员函数。
书写标准:
在定义抽象类时继承的类加上metaclass=abc. ABCmeta
在定义的抽象类中声明属性前加上@abc.abstractproperty
在定义的抽象类中声明属性前加上@abc.abstractmethod
注意
1为抽象方法不包含任何可实现的代码,因此其函数体通常使用pass。下面演示抽象类的实现和多态。所谓的多态指的是在抽象类中定义一个方法,可以在其子类中重新实现,不同子类中实现的方法也不尽相同。
2. 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
EG1: 抽象类不能被实例化
import abc
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def display(self):
pass
a = A()
执行结果:
Traceback (most recent call last):
File "E:/project/tkinter/tkinter_learn.py", line 868, in <module>
a = A()
TypeError: Can't instantiate abstract class A with abstract methods display
EG2:继承抽象类必须实现抽象方法
import abc
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def display(self):
pass
class B(A):
def show(self):
print("我是B")
b = B()
b.display()
实行结果:
Traceback (most recent call last):
File "E:/project/tkinter/tkinter_learn.py", line 871, in <module>
b = B()
TypeError: Can't instantiate abstract class B with abstract methods display
EG3:继承抽象类实现实例化
import abc
class A(metaclass=abc.ABCMeta):
@abc.abstractmethod
def display(self):
pass
class B(A):
def display(self):
print("我是B")
b = B()
b.display()
实行结果:
我是B
https://www.cnblogs.com/zihe/p/7111092.html