【发布时间】:2018-11-07 19:04:16
【问题描述】:
我发现了多种(略有不同)在 Python 中定义抽象类的方法。我阅读了文档,也无法在 stackoverflow 上找到答案。
三个例子的主要区别(见下面的代码)是:
-
A明确设置一个新元类abc.ABCMeta -
B继承自abc.ABC -
C继承自objects但定义了@abc.abstractmethod类
似乎A 和B 没有区别(即B 也有新的元类abc.ABCMeta)。但是,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)) # <class 'abc.ABCMeta'>
print("---")
Bimpl().foo() # Bimpl
print(isinstance(Bimpl, B)) # False
print(issubclass(Bimpl, B)) # True
print(isinstance(Bimpl, abc.ABCMeta)) # True
print(type(B)) # <class 'abc.ABCMeta'>
print("---")
Cimpl().foo() # Cimpl
print(isinstance(Cimpl, C)) # False
print(issubclass(Cimpl, C)) # True
print(isinstance(Cimpl, abc.ABCMeta)) # False
print(type(C)) # <class 'type'>
print("---")
【问题讨论】:
-
“尽管如此,C 类的行为似乎符合我对 ABC 的期望。” – 究竟是什么意思?您期望什么以及它的表现如何?
标签: python python-3.x abstract-class