python - Python中的抽象方法

标签 python oop python-3.x abstract-class

我需要类似 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) 会改进什么吗?

最佳答案

在 Python 中,您通常会避免同时使用这些抽象方法。您通过文档定义一个接口(interface),并简单地假设传入的对象满足该接口(interface)(“鸭子类型”)。

如果你真的想用抽象方法定义一个抽象基类,这可以使用 abc 来完成。模块:

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() 的机制,但通常会避免 isinstance() 检查鸭子打字的青睐。如果需要,请使用它,但不要作为定义接口(interface)的通用模式。

关于python - Python中的抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5856963/

相关文章:

python 2.7/Linux : socket library binding type error

c++ - 使用基于数组的列表 c++ 合并 2 个数组

javascript - 将 for in 替换为带有对象的常规 for 循环

python - 如何继续询问用户输入,直到认为输入有效?

python - 浏览一个大的 numpy.ndarray

python-3.x - 如何在QStackedWidget中制作 "finish"按钮

python - 根据文本语料库中的出现次数列出词汇表中的单词,使用 Scikit-Learn CountVectorizer

python - Jupyterhub/单用户共享卷

javascript - 在 Python 中转义 JavaScript 字符串

c++ - 在面向对象编程中分配新内存时处理代码中不同构造函数导致的错误