繁体   English   中英

为什么python中的对象是'instance'类型?

[英]Why an object in python is of type 'instance'?

我有以下代码:

>>> class MyClass:
    pass

>>> myObj=MyClass()

>>> type(myObj)
<type 'instance'>     <==== Why it is not type MyClass ?

>>> type(MyClass)
<type 'classobj'>  <=== Why it is not just 'MyClass'?

>>> isinstance(myObj, instance)  <==== Why the 'instance' is not defined?

Traceback (most recent call last):
  File "<pyshell#91>", line 1, in <module>
    isinstance(myObj, instance)
NameError: name 'instance' is not defined

>>> isinstance(myObj, MyClass)
True

>>> myObj.__class__
<class __main__.MyClass at 0x0000000002A44D68> <=== Why different from type(myObj) ?

似乎Python在类和它的实例类型之间有一些额外的间接

我习惯了C#。 在C#中, typeof(MyClass)将返回MyClass

加1

以下是2.7.6和3.4.1之间的一些比较。

我想知道如何在Python中实现==运算符。

在此输入图像描述

这是因为你使用的是旧式的课程 而不是做:

class MyClass:
    pass

你需要这样做:

class MyClass(object):
    pass

...为了使用新式的课程。 现在,如果你type(myObj) ,你会按预期返回<class '__main__.MyClass'>

事实上,Python引入新式类的主要原因之一正是由于您观察到的问题:

Python 2.2中引入了新式类来统一类和类型。 新式类既不是用户定义的类型,也不是用户定义的类型。 如果x是新样式类的实例,则type(x)通常与x.__class__相同(虽然这不能保证 - 允许新样式类实例覆盖为x.__class__返回的值) 。

引入新式类的主要动机是提供具有完整元模型的统一对象模型。 它还具有许多实际的好处,例如能够对大多数内置类型进行子类化,或者引入“描述符”,它们可以启用计算属性。

来源

这有点像kludge,不得不扩展object ,但幸运的是在Python 3中,旧式类被完全删除,因此使用任一种形式声明类都做同样的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM