Проверка isinstance(something, io.IOBase)
проверяет только, является ли something
экземпляром io.IOBase
или производным от него классом, поэтому я не понимаю, откуда у вас ошибочное представление о том, что это «правильный» способ определить, является ли объект «файлоподобным».
Другой способ сделать это — использовать Абстрактный базовый класс. Python имеет ряд встроенных, но в настоящее время нет файла для файлов, который можно было бы использовать с isinstance()
. Однако вы можете определить свой собственный с помощью модуля abc
, как описано в PEP 3119< /а>.
На веб-сайте Модуль недели Python есть хорошее объяснение использования модуля 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
, если будут предприняты какие-либо попытки создать его экземпляр.)
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
person
martineau
schedule
27.12.2013