可能不是。但我试过了
这真的很奇怪,感觉就像海龟一样。事实上,我以前并没有深入研究过这个竞技场,尽管它听起来很有趣,很强大。这个解释令人困惑,那页上的其他信息也是如此,但我觉得我有一些启示。我不确定我能否解释清楚,但我会试试的。在
让我们先看看海龟:>>> isinstance(type, object)
True
>>> isinstance(object, type)
True
等等,什么?在
当type是{}的实例时,object是{}的实例吗?感觉就像在说:
^{pr2}$
两次都应该是True。但显然不是。甚至(正如塔赫格·麦克唐纳·詹森指出的那样)>>> isinstance(type, type)
True
这应该向你表明,在幕后有一些魔术正在上演。所以在这一点上,让我们完全忘记Python(我知道,我们为什么要做这么可怕的事情?)在
一般来说,所有的计算机程序都是1和0的(更准确地说,它们只是一堆逻辑门和电子,>;~2.5v和~<;2.5v,但0和1就足够了)。不管你是用汇编、实际的机器代码、Python、C、Java、Perl等等编写的,它们都只是位。在
如果你写一个类定义,那么这个类就是比特。这个类的一个实例就是更多的位。一种编程语言,一个编译器和一个解释器只是更多的比特。在
在Python的例子中,python解释器为我们的Python程序赋予了意义。有趣的是,很多我们通常认为是Python的东西实际上是用Python编写的(尽管对于我们CPython来说,大部分是C语言,而Jython则是Java,等等)。在
现在我们来讨论这个问题,我们称之为type和{}。正如文章指出的,它们有点特别。所以,我们知道我们可以创建一个类,然后这个类就是一个对象:>>> class Confusion: pass
...
>>> isinstance(Confusion, object)
这是有道理的,如果你仔细想想,你可能已经创建了类级别的变量:>>> class Counter:
... count = 0
... def __init__(self):
... Counter.count += 1
... print(self.count)
...
>>> Counter()
1
>>> Counter()
2
>>> Counter()
3
>>> Counter()
4
>>> Counter.count
4
>>> Counter.__repr__(Counter)
''
但正如最后一个例子所示(并在文章中提到),一个类声明,你用class SomeClass: pass得到的,一个类的声明实际上是另一个类的实例。特别是,它是type类的一个实例。当调用实例(我们称之为类)时,将生成一个实例:>>> Counter.__call__()
5
那么这一切与type和{}之间的关系有什么关系呢?在
好吧,在某个的地方,python创建了一系列的object和一系列的type,然后以这样一种方式将它们连接在一起>>> type.__bases__
(,)
>>> object.__bases__
()
因为我目前不想查看源代码,所以我将猜测type是首先创建的,object是从该类型生成的,type.__bases__被设置为(class 'object')。通过在type和object之间创建这种循环关系,它给人的感觉是一路向下都是海龟,而实际上最后两只海龟只是站在一起。在
我不认为有什么比这篇文章描述它更好的方式来解释这里发生了什么,至少在经典的OOP中是一种思维方式,因为它实际上不是那种东西。就像试图在二维空间绘制三维图形一样,你会遇到问题。在
只有两组比特,它们里面有一些比特正好是彼此的地址。在