我对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注册其他课程有什么好处
它只是使
issubclass(io.IOBase, IStream)
返回True
(这意味着io.IOBase
的实例是IStream
的实例)。由注册类的程序员来确保io.IOBase
实际上符合IStream
定义的API原因是让您以
IStream
的形式定义一个接口,并让您指示可能没有实际从IStream
继承的类满足该接口。本质上,它只是形式化的duck类型相关问题 更多 >
编程相关推荐