abc: 是 Python 标准库中的一个模块,主要用于定义抽象基类(Abstract Base Classes)。抽象基类提供了一种机制,允许我们在面向对象编程中定义接口,以确保子类实现特定的方法或属性。
示例代码:
from abc import ABC, abstractmethod
class ABCBase(ABC):
@abstractmethod
def hello(self):
pass
def hi(self):
pass
class MyClass(ABCBase):
def fun(self):
print('this is fun')
上述代码运行不报错。但是当对MyClass进行实例化时,就会提示错误。
myclass = MyClass()
错误提示:
Traceback (most recent call last):
File "F:\RolandWork\PythonProjects\studyPython\forTest.py", line 15, in <module>
myclass = MyClass()
^^^^^^^^^
TypeError: Can't instantiate abstract class MyClass with abstract method hello
原因是我们定义了抽像基类后,继承它的子类要实现所有基类里的抽象方法。 所以我们在子类中增加对基类中抽象方法hello的实现,就不会再报错了。
from abc import ABC, abstractmethod
class ABCBase(ABC):
@abstractmethod
def hello(self):
pass
def hi(self):
print('基类 say hi')
class MyClass(ABCBase):
def fun(self):
print('this is fun')
def hello(self):
print('子类 say hello')
myclass = MyClass()
myclass.hello()
myclass.hi()
输出结果:
子类 say hello
基类 say hi
并且,只要是基类和子类的方法名相同,即便方法签名不同,也不报错。
from abc import ABC, abstractmethod
class ABCBase(ABC):
@abstractmethod
def hello(self, name):
pass
@abstractmethod
def hi(self):
print('基类 say hi')
class MyClass(ABCBase):
def hello(self):
print('子类 say hello')
def hi(self, name):
print('子类 say hi', name)
myclass = MyClass()
myclass.hello()
myclass.hi('Roland')
输出结果:
子类 say hello
子类 say hi Roland
标签:abc,子类,self,hi,模块,基类,hello,def
From: https://www.cnblogs.com/rolandhe/p/18622471