假设您有以下类:
class Base(object):
def abstract_method(self):
raise NotImplementedError
那么你能不能实现一个不实现抽象方法的继承类?例如,当它不需要该特定方法时。这会带来问题还是只是不好的做法?
答案 0 :(得分:4)
如果您按照您展示的方式实现抽象方法,则不会强制整个类的抽象性,只有没有具体定义的方法。因此,您可以创建 Base
的实例,而不仅仅是其子类。
b = Base() # this works following your code, only b.abstract_method() raises
def Derived(Base):
... # no concrete implementation of abstract_method, so this class works the same
但是,如果您使用标准库中的 the abc
module 来指定抽象方法,它将不允许您实例化任何没有继承的任何抽象方法的具体实现的类的实例。您可以在中间抽象基类中保留未实现的继承抽象方法(例如,原始基类的子类,它本身仍然是抽象的),但您不能创建任何实例。 >
以下是使用 abc
的样子:
from abc import ABCMeta, abstractmethod
class ABCBase(metaclass=ABCMeta):
@abstractmethod
def abstract_method(self, arg):
...
class ABCDerived(ABCBase):
... # we don't implement abstract_method here, so we're also an abstract class
d = ABCDerived() # raises an error