我有以下代码:
>>> 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) ?
Run Code Online (Sandbox Code Playgroud)
似乎Python 在类和它的实例类型之间有一些额外的间接.
我习惯了C#.在C#中,typeof(MyClass)只会返回MyClass.
以下是2.7.6和3.4.1之间的一些比较.
我想知道如何==在Python中实现运算符.

这是因为你使用的是旧式的课程.而不是做:
class MyClass:
pass
Run Code Online (Sandbox Code Playgroud)
你需要这样做:
class MyClass(object):
pass
Run Code Online (Sandbox Code Playgroud)
...为了使用新式的课程.现在,如果你这样做type(myObj),你会<class '__main__.MyClass'>按预期回来.
事实上,Python引入新式类的主要原因之一正是由于您观察到的问题:
Python 2.2中引入了新式类来统一类和类型.新式类既不是用户定义的类型,也不是用户定义的类型.如果x是新样式类的实例,那么
type(x)通常是相同的x.__class__(尽管不能保证 - 允许新样式类实例覆盖返回的值x.__class__).引入新式类的主要动机是提供具有完整元模型的统一对象模型.它还具有许多实际的好处,例如能够对大多数内置类型进行子类化,或者引入"描述符",它们可以启用计算属性.
(来源)
这是一个必须扩展的kludge,object但幸运的是,在Python 3中,旧式类被完全删除,因此使用任一种形式声明类都做同样的事情.
| 归档时间: |
|
| 查看次数: |
3686 次 |
| 最近记录: |