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 就是其中之一。
编程 » C++, 编译错误
在 gcc 中,存在继承关系的模版类,子类无法直接访问父类的成员,即使该成员是protectedpublic
相似度: 0.096
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径:
主要形式是下面三种。后面两种实际指向同一个位置(如果path是一个已存在的文件夹),但处理结果会有所差异。
datetime 是 Python 的标准库:
智能指针在现代 C++里用得越多。以前只知道它大致的原理,比如使用引用计数。但很多实现细节并不清楚,最直接的,它是如何实现多线程安全的?今天找了 gnu c++ library 的实现好好看了一下。
在 Python 中操作文件或字符串时,有时候会碰到 UnicodeDecodeError 异常:
编程 » C++, 数据容器, folly
folly::dynamic提供类似于C++的动态类型。和std::any可以容纳任意类型不一样,folly::dynamic只支持保存以下几种类型:
编程 » Python, 并行计算
核心就是threading.Thread
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
IT » ubuntu, 网络代理
下面命令设置环境变量http_proxyhttps_proxyhttp://127.0.0.1:7890,分别用于访问非加密和加密网址。目前大部分网址都是加密网址。