gpt4 book ai didi

python - 如何使类似文件的类与 "isinstance(cls, io.IOBase)"一起工作?

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:10 25 4
gpt4 key购买 nike

似乎检查 isinstance(..., io.IOBase) 是确定对象是否“类文件”的“正确”方法。

但是,当定义我自己的类文件类时,它似乎不起作用:

import io

class file_like():

def __init__(self):
pass

def write(self, line):
print("Written:", line)

def close(self):
pass

def flush(self):
pass

print(isinstance(file_like(), io.IOBase))
# Prints 'False'

我怎样才能让它发挥作用?

最佳答案

isinstance(obj, some_class) 只是迭代 obj 的继承链,寻找 some_class。因此 isinstance(file_like, io.IOBase) 将为假,因为您的 file_like 类在其祖先中没有 io.IOBasefile_like 不指定显式父级,因此它仅隐式继承自 object。这是唯一的类 - 除了 file_like 本身 - 将使用 isinstance()file_like 实例进行测试。

您在 file_like 中所做的是定义类文件对象所期望的方法,而不是从任何特定的“类文件”类继承。这种方法称为 duck-typing ,它在动态语言中有很多优点,尽管它在其他语言(例如 Ruby)中比 Python 更受欢迎。尽管如此,如果您提供的 file_like 实例遵循鸭子类型,它应该可以工作,前提是您的 file_like 实际上“像文件一样嘎嘎作响”,即行为足够像一个文件,在接收端使用时不会导致错误。

当然,如果接收端不遵循 duck-typing,例如像您在此处所做的那样尝试通过 isinstance() 检查类型,则此方法将失败。

最后,一个小的风格问题:如果类没有显式继承任何东西,就不要在类上放置空括号。它们是多余的。

关于python - 如何使类似文件的类与 "isinstance(cls, io.IOBase)"一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20794182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com