Python3中如何获取类的字符串名称及判断对象类名是否匹配
2. 如何对比类名的字符串?(以及你尝试失败的原因)
先说说你为什么得到了 False:
你写的 a.__class__ == 'io.TextIOWrapper' 里,左边是类对象(<class '_io.TextIOWrapper'>),右边是字符串,两者类型完全不同,肯定不会相等;另外还要注意,这个类的完整路径是 _io.TextIOWrapper(带下划线),不是你写的 io.TextIOWrapper,就算改成字符串对比也会因为名字不对失败。
下面给你两种可行的方案:
方案一:字符串形式对比(不推荐,但满足你的需求)
先拿到包含模块的完整类名字符串,再进行对比:
a = open('/etc/passwd') # 获取完整类名(模块+类名) full_class_name = f"{a.__class__.__module__}.{a.__class__.__name__}" print(full_class_name == '_io.TextIOWrapper') # 输出: True
方案二:直接对比类对象(推荐,更可靠)
在Python里,检查对象类型的标准做法是用 isinstance() 或者直接对比 type(),比字符串对比靠谱多了——毕竟字符串可能写错,而且无法处理继承关系:
import _io a = open('/etc/passwd') # 方法1:用isinstance(推荐,支持子类继承) print(isinstance(a, _io.TextIOWrapper)) # 输出: True # 方法2:直接对比type(仅严格匹配当前类型) print(type(a) is _io.TextIOWrapper) # 输出: True
为什么推荐 isinstance()?举个例子,如果有一个类继承自 _io.TextIOWrapper,它的实例用 isinstance() 也会返回 True,但 type() is 只会返回 False,前者更符合大多数场景的类型检查需求。
内容的提问来源于stack exchange,提问作者Machine Yadav
相关产品推荐
相关产品推荐

