抽象基类
import abc
class A(abc.ABC):
pass
class A(metaclass=abc.ABCMeta):
pass
from six import PY3, add_metaclass
@add_metaclass(abc.ABCMeta)
class A(object):
pass
抽象基类的目的
抽象基类的目的是让别的类继承它并实现特定的抽象方法
抽象基类的应用
代码中检查某些类是否为特定类型,实现了特定接口
抽象方法(@abstractmethod)
1、有 abstractmethod 装饰的方法且未重写 的类不能实例化
2、父类已经重写父类的父类的抽象方法,则子类可以正常实例化
3、继承了含@abstractmethod的实例/类/静态方法的子类,可不实例化,仅调用类方法和静态方法(无论这些类、静态方法是否被abstractmethod装饰)
4、子类可以将abstractmethod装饰的类方法或静态方法重写为实例方法,即可实例化
总结:abstractmethod仅针对实例化。
1 代码
import abc
class A(ABC):
@abstractmethod
def a1(self):
print('A-a1')
class B(A):
def test(self):
print('test')
B().test() # 报错
2 代码
imoprt abc
class A(ABC):
@classmethod
@abstractmethod
def a2(cls):
pass
@staticmethod
@abstractmethod
def a3():
pass
class B(A):
def test(self):
print('test')
B().test() # 报错, 未重写抽象方法a2(), 抽象方法a3()
B.a2() # 不报错
B.a3() # 不报错
抽象 类方法和静态方法(abstractstaticmethod| abstractclassmethod)
python3.3版本
之后不推荐使用- 使用abstractmethod和类/静态方法装饰器代替
class C(ABC):
@staticmethod
@abstractmethod
def my_abstract_staticmethod(...):
@classmethod
@abstractmethod
def my_abstract_classmethod(cls, ...):
抽象property(abstractproperty)
python3.3版本
之后不推荐使用- 使用abstractmethod和 property替代
class C(ABC):
@property
@abstractmethod
def x(self):
@x.setter
@abstractmethod
def x(self, value):