【发布时间】:2014-03-17 07:59:23
【问题描述】:
我正在尝试了解使用 abstract base classes 的好处。考虑这两段代码:
抽象基类:
from abc import ABCMeta, abstractmethod, abstractproperty
class CanFly:
__metaclass__ = ABCMeta
@abstractmethod
def fly(self):
pass
@abstractproperty
def speed(self):
pass
class Bird(CanFly):
def __init__(self):
self.name = 'flappy'
@property
def speed(self):
return 1
def fly(self):
print('fly')
b = Bird()
print(isinstance(b, CanFly)) # True
print(issubclass(Bird, CanFly)) # True
普通继承:
class CanFly(object):
def fly(self):
raise NotImplementedError
@property
def speed(self):
raise NotImplementedError()
class Bird(CanFly):
@property
def speed(self):
return 1
def fly(self):
print('fly')
b = Bird()
print(isinstance(b, CanFly)) # True
print(issubclass(Bird, CanFly)) # True
如您所见,这两种方法都支持使用isinstance 和issubclass 的变形。
现在,我知道的一个区别是,如果您尝试在不覆盖所有抽象方法/属性的情况下实例化抽象基类的子类,您的程序将会失败。但是,如果您对 NotImplementedError 使用普通继承,则在您实际调用相关方法/属性之前,您的代码不会失败。
除此之外,使用抽象基类有何不同?
【问题讨论】:
-
@JayanthKoushik 我不认为这个问题是那个问题的重复,因为这是关于抽象基类与普通继承的问题,而另一个问题是关于抽象基类与鸭子的问题打字。
标签: python abstract-base-class