一个类必须实现所有抽象方法吗?

时间:2021-01-19 21:33:43

标签: python class oop

假设您有以下类:

class Base(object):
    def abstract_method(self):
        raise NotImplementedError

那么你能不能实现一个不实现抽象方法的继承类?例如,当它不需要该特定方法时。这会带来问题还是只是不好的做法?

1 个答案:

答案 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
相关问题