Python中的抽象方法

2024-06-01 13:05:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个Python(3.2)中的abstract protected方法:

class Abstract:
    def use_concrete_implementation(self):
        print(self._concrete_method())

    def _concrete_method(self):
        raise NotImplementedError()


class Concrete(Abstract):
    def _concrete_method(self):
        return 2 * 3

定义一个“抽象”方法仅仅是为了引发一个NotImplementedError,这真的有用吗?

对抽象方法使用下划线(在其他语言中是protected)是一种好的样式吗?

抽象基类(abc)能改进什么吗?


Tags: 方法selfabstractusedefmethodimplementationclass
1条回答
网友
1楼 · 发布于 2024-06-01 13:05:13

有疑问时,do as Guido does.

没有下划线。只需将“抽象方法”定义为引发NotImplementedError的一行:

class Abstract():
    def ConcreteMethod(self):
        raise NotImplementedError("error message")
网友
2楼 · 发布于 2024-06-01 13:05:13

在Python中,通常避免将这些抽象方法组合在一起。您可以通过文档定义一个接口,并简单地假设传入的对象实现该接口(“duck typing”)。

如果您真的想用抽象方法定义抽象基类,可以使用^{}模块来完成:

from abc import ABCMeta, abstractmethod

class Abstract(metaclass=ABCMeta):
    def use_concrete_implementation(self):
        print(self._concrete_method())

    @abstractmethod
    def _concrete_method(self):
        pass

class Concrete(Abstract):
    def _concrete_method(self):
        return 2 * 3

再说一次,这不是Python通常的方式。abc模块的主要目标之一是引入一种重载机制,但是通常避免使用isinstance()检查,而使用duck类型。如果需要,请使用它,但不要将其用作定义接口的通用模式。

网友
3楼 · 发布于 2024-06-01 13:05:13

基本上,这里不需要基类中的空方法。就这样做:

class Abstract:
    def use_concrete_implementation(self):
        print(self._concrete_method())

class Concrete(Abstract):
    def _concrete_method(self):
        return 2 * 3

实际上,在Python中,您通常甚至不需要基类。由于所有调用都是动态解析的,如果方法存在,则将调用该方法,否则将引发AttributeError

注意:在文档中必须提到_concrete_method需要在子类中实现。

相关问题 更多 >