何时在 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
是一个类。您可以将“类型”和“类”视为同义词。实际上,它是类对象的类,一个元类。但它是一个类,就像int
、float
、list
、dict
等。或者就像一个使用定义的类,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
,假设您想区分int
和bool
对象。在 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()