抽象基类寄存器方法实际上做什么?

2024-09-29 00:19:36 发布

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

我对ABC注册法感到困惑

以下面的代码为例:

import io
from abc import ABCMeta, abstractmethod

class IStream(metaclass=ABCMeta):
    @abstractmethod
    def read(self, maxbytes=-1):
        pass
    @abstractmethod
    def write(self, data):
        pass

IStream.register(io.IOBase)

f = open('foo.txt')

isinstance(f, Istream) # returns true

当您注册io.IOBase时,会发生什么?你们是说IOBase类只能有Istream ABC类定义的方法吗?ABC注册其他课程有什么好处


Tags: 代码fromioimportselfdefpassclass
1条回答
网友
1楼 · 发布于 2024-09-29 00:19:36

它只是使issubclass(io.IOBase, IStream)返回True(这意味着io.IOBase的实例是IStream的实例)。由注册类的程序员来确保io.IOBase实际上符合IStream定义的API

原因是让您以IStream的形式定义一个接口,并让您指示可能没有实际从IStream继承的类满足该接口。本质上,它只是形式化的duck类型

相关问题 更多 >