【发布时间】:2021-01-19 21:33:43
【问题描述】:
假设你有以下类:
class Base(object):
def abstract_method(self):
raise NotImplementedError
然后你能实现一个不实现抽象方法的继承类吗?例如,当它不需要该特定方法时。这会带来问题还是只是不好的做法?
【问题讨论】:
假设你有以下类:
class Base(object):
def abstract_method(self):
raise NotImplementedError
然后你能实现一个不实现抽象方法的继承类吗?例如,当它不需要该特定方法时。这会带来问题还是只是不好的做法?
【问题讨论】:
如果您按照您所展示的方式实现抽象方法,则没有什么可以强制整个类的抽象性,只有没有具体定义的方法。因此,您可以创建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 来指定抽象方法,它将不允许您实例化任何没有其继承的任何抽象方法的具体实现的类的实例。您可以在中间抽象基类(例如,原始基类的子类,它本身仍然是抽象的)中保留未实现的继承抽象方法,但您不能创建任何实例。 p>
下面是使用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
【讨论】:
abc 模块我可以让它更严格。不使用abc 且不实现abstract_method() 的继承类是否仍会引发NotImplementedError?这感觉像是不好的做法,但我有一个特定的用例可能会派上用场。
abc,那么无论类的方法可能引发什么异常,都不会阻止实例化一个类。 认为一个类在调用时引发的方法是抽象的,这可能是一个坏主意,但创建一个类不一定是一个糟糕的设计。