何时在 python 中使用 type() 而不是 isinstanceof()? [复制]

Posted

技术标签:

【中文标题】何时在 python 中使用 type() 而不是 isinstanceof()? [复制]【英文标题】:When to use type() instead of isinstanceof() in python? [duplicate] 【发布时间】:2020-09-02 03:25:55 【问题描述】:

根据我在谷歌上的阅读,isinstanceof() 似乎总是比type() 好。

python中使用type()优于isinstanceof()有哪些情况?

我正在使用 python 3.7。

【问题讨论】:

type 在您想确切地知道某物的类型时很有用。在调试某些东西,甚至只是试图理解它时,它特别有用。 isinstance 适用于您不需要知道确切类型的情况,只要它是从某个特定类型派生的(例如,您不介意它是继承类型还是类型本身)。 这能回答你的问题吗? What are the differences between type() and isinstance()? @David,我有点厚。当我阅读答案时,我的印象是 isinstanceof() 总是比 type() 好。它没有直接回答我的问题。 来自this answer:使用isinstance(obj, Base) 进行类型检查允许子类和多个可能的基类的实例:isinstance(obj, (Base1, Base2)) 而使用type(obj) is Base 进行类型检查仅支持引用的类型。 这不一定是关于好坏,而是关于你的用例是什么...... 【参考方案1】:

type 表示变量的类型:

a = 10
type(a)

它会将它的类型指定为'int'

isinstance() 表示变量是否与指定类型相关

class b:
def __init__(self):
    print('Hi')

c = b()

m = isinstance(c, b)

它将返回 True,因为对象 c 是类类型 a,否则它将返回 False。

【讨论】:

【参考方案2】:

他们做两件不同的事情,你不能直接比较它们。您可能已经阅读到,当在运行时检查对象的类型时,您应该更喜欢isinstance。但这并不是type 的唯一用例(正如其名称所暗示的那样,isinstance 的用例)。

可能不明显的是type 是一个。您可以将“类型”和“类”视为同义词。实际上,它是类对象的类,一个元类。但它是一个类,就像intfloatlistdict 等。或者就像一个使用定义的类,class Foo: pass

在其单参数形式中,它返回您传入的任何对象的。这是可用于类型检查的表单。它本质上等同于some_object.__class__

>>> "a string".__class__
<class 'str'>
>>> type("a string")
<class 'str'>

注意:

>>> type(type) is type
True

如果您出于其他原因想要访问对象本身的类型,您可能会发现此表单很有用。

在其三参数形式中,type(name, bases, namespace) 它返回一个新类型对象,一个新类。就像任何其他类型构造函数一样,就像 list() 返回一个新列表一样。

所以而不是:

class Foo:
    bar = 42
    def __init__(self, val):
        self.val = val

你可以写:

def _foo_init(self, val):
    self.val = val

Foo = type('Foo', (object,), 'bar':42, '__init__': _foo_init)

isinstance 是一个检查...对象是否是某种类型的实例的函数。它是一个用于自省的函数。

当你想反省一个对象的类型时,通常你可能会使用isintance(some_object, SomeType),但你也可能会使用type(some_object) is SomeType。主要区别在于isinstance 将返回True 如果some_object.__class__精确 SomeType 任何其他类型SomeType 继承自(即在SomeType,SomeType.mro())的方法解析顺序。

所以,isinstance(some_object, SomeType) 本质上等同于some_object.__class__ is SomeType or some_object.__class__ in SomeType.mro()

而如果您使用type(some_object) is SomeType,您只是在询问some_object.__class__ is SomeType

下面是一个实际示例,说明您何时可能希望使用type 而不是isinstance,假设您想区分intbool 对象。在 Python 中,bool 继承自 int,所以:

>>> issubclass(bool, int)
True

也就是说:

>>> some_boolean = True
>>> isinstance(some_boolean, int)
True

但是

>>> type(some_boolean) is int
False

【讨论】:

以上是关于何时在 python 中使用 type() 而不是 isinstanceof()? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

何时以及如何在 python 中使用内置函数 property()

何时使用三重单引号而不是三重双引号

何时在 Python 中使用哪些数组实现? [复制]

Python中为什么推荐使用isinstance来进行类型判断?而不是type

何时在 F# 中使用序列而不是列表?

为啥使用片段,以及何时使用片段而不是活动?