Python 的抽象基类 ABC

作者: , 共 933 字 , 共阅读 0

Pyhon 的抽象基类( abstruct base class )库abc定义了类似于 C++的纯虚函数的功能:

from abc import ABC, abstractmethod

class Base(ABC):
    # 定义一个纯需函数,子类必须实现该函数,否则会在实例初始化时抛出 TypeError 异常。
    @abc.abstractmethod
    def foo(self):
        print("this is foo of base, but never will be called!") 

    # @abstractmethod 可以和  @classmethod 混用。
    @classmethod
    @abstractmethod
    def bar(cls):
        raise NotImplementedError()

class Concrete(Base):   
    def foo(self):
        return 'foo() called'

c = Concrete();   # will raise TypeError    

这很类似于 C++的纯虚函数:

class Base {
    virtual void foo() = 0;
    virtual void bar() = 0;
};

class Concrete : public Base {
    void foo() override {
        return "foo() called";
    }
};

使用注意事项:

  • 如果没有定义@abstractmethod的成员函数,即使继承ABC,也可以实例化。
  • 定义为@abstractmethod的函数,里面的实现无法被调用,比如上面例子里,Base.foo()或通过super()调用都是不行的。这和 C++不一样。
  • @abstractmethod可以和@staticmethod@classmethod之类的修饰符联用。

Q. E. D.

类似文章:
Python 提供很多语法糖,用起来非常方便。@dataclass 就是其中之一。
编程 » Python
今天写一段程序时遇到一个问题,查了好一会才搞清楚。代码可以简化为下面这个小代码:
编程 » C++, 编译错误
在 gcc 中,存在继承关系的模版类,子类无法直接访问父类的成员,即使该成员是protectedpublic
编程 » python, 单元测试
unittest 是 python 官方的单元测试工具。最近发现一个之前没注意到的盲区:
命令行参数的初步说明,请参考argparse 模块用法实例详解,写的很清晰而详细。
编程 » Python
在 Python 中,有时候为了获取当前运行的脚本的同目录下的另外一个文件,会这么写:
主要形式是下面三种。后面两种实际指向同一个位置(如果path是一个已存在的文件夹),但处理结果会有所差异。
智能指针在现代 C++里用得越多。以前只知道它大致的原理,比如使用引用计数。但很多实现细节并不清楚,最直接的,它是如何实现多线程安全的?今天找了 gnu c++ library 的实现好好看了一下。
datetime 是 Python 的标准库:
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
IT » ubuntu, 网络代理
下面命令设置环境变量http_proxyhttps_proxyhttp://127.0.0.1:7890,分别用于访问非加密和加密网址。目前大部分网址都是加密网址。