我发现了在Python中定义抽象类的多种方法(稍有不同)。我阅读了文档,在stackoverflow上也找不到答案。在
这三个示例(见下面的代码)之间的主要区别是:A显式地设置一个新的元类abc.ABCMeta
B继承自abc.ABC
C继承自objects,但定义了@abc.abstractmethod类
似乎A和{}没有区别(也就是说,B也有新的元类{})。但是,类C仍然是type类型。在
不为C定义元类有什么影响?什么时候有必要定义元类,或者不为抽象类定义abc.ABCMeta元类是错误/错误的风格?尽管如此,类C的行为似乎与我从ABC中所期望的一样。在import abc
class A(metaclass=abc.ABCMeta):
# Alternatively put __metaclass__ = abc.ABCMeta here
@abc.abstractmethod
def foo(self):
raise NotImplementedError
class B(abc.ABC):
@abc.abstractmethod
def foo(self):
raise NotImplementedError
class C(object):
@abc.abstractmethod
def foo(self):
raise NotImplementedError
class Aimpl(A):
def foo(self):
print("Aimpl")
class Bimpl(B):
def foo(self):
print("Bimpl")
class Cimpl(C):
#def foo(self):
# print("Cimpl")
pass
Aimpl().foo() # Aimpl
print(isinstance(Aimpl, A)) # False
print(issubclass(Aimpl, A)) # True
print(isinstance(Aimpl, abc.ABCMeta)) # True
print(type(A)) #
print("---")
Bimpl().foo() # Bimpl
print(isinstance(Bimpl, B)) # False
print(issubclass(Bimpl, B)) # True
print(isinstance(Bimpl, abc.ABCMeta)) # True
print(type(B)) #
print("---")
Cimpl().foo() # Cimpl
print(isinstance(Cimpl, C)) # False
print(issubclass(Cimpl, C)) # True
print(isinstance(Cimpl, abc.ABCMeta)) # False
print(type(C)) #
print("---")