检查isinstance(something, io.IOBase)
只检查是否something
是从它派生的一个io.IOBase
或一个类的实例 - 所以我不明白你在哪里得到错误的想法,即它是确定一个对象是否是“类文件”的“正确”方法。
另一种方法是使用Abstract Base Class。Python 有许多内置的,但目前还没有一个可以与isinstance()
. 但是,您可以使用PEP 3119abc
中概述的模块来定义自己的模块。
The Python Module of the Week webiste很好地解释了如何使用该abc
模块来做这样的事情。而这个高度评价的答案正确的方法来检测序列参数?显示了定义您自己的 ABC 的类似方法。
为了说明将其应用于您的案例,您可以定义一个像这样的 ABC 及其所有方法抽象 - 从而强制派生类定义所有它们以便被实例化:
from abc import ABCMeta, abstractmethod
class ABCFileLike(metaclass=ABCMeta):
@abstractmethod
def __init__(self): pass
@abstractmethod
def write(self, line): pass
@abstractmethod
def close(self): pass
@abstractmethod
def flush(self): pass
然后,您可以从中派生出您自己的具体类,确保提供所有抽象方法的实现。(如果您没有全部定义它们,那么TypeError
如果尝试实例化它,则会引发 a。)
class FileLike(ABCFileLike):
""" Concrete implementation of a file-like class.
(Meaning all the abstract methods have an implementation.)
"""
def __init__(self):
pass
def write(self, line):
print("Written:", line)
def close(self):
pass
def flush(self):
pass
print(isinstance(FileLike(), ABCFileLike)) # -> True
您甚至可以通过向新元类注册现有类来添加它们:
import io
print(isinstance(io.IOBase(), ABCFileLike)) # -> False
ABCFileLike.register(io.IOBase)
print(isinstance(io.IOBase(), ABCFileLike)) # -> True