gpt4 book ai didi

python - 万物皆对象是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 21:24:12 24 4
gpt4 key购买 nike

我理解一切皆对象背后的主要理论,但我真的不明白它是如何在幕后实现的。

函数

因此:foo(4)foo.__call__(4) 相同。但是,是什么阻止我执行 foo.__call__.__call__(4)

foo 是一个函数,foo.__call__... 都是该函数的方法包装器,但是当我调用一个函数时,它们中的哪一个被调用了?

所有这些属性

我的foo函数有很多属性,而那些对象中的每一个都存储了很多属性,那么它如何不占用无限内存呢?

sys.getsizeof('a') 生成 22,这对于一个字符来说似乎相当大,但由于它引用了 71 个属性,所以非常小。

我想我想问的是,如果我想实现一个简单的 python 版本(我不想,但这似乎是最好的提问方式)我将如何实现它?

编辑 1我看了一下内置函数,意识到它们引用了相同的属性 (id('a'.upper) == id('b'.upper))。这让我问它如何知道它正在访问什么对象?

编辑 2 作为 pts points out 'a'.upper 不是 'b'.upper,这样就清楚了。

我看过 source for IronPython我认为这会帮助我理解,但它让我更加困惑。

最佳答案

我认为您感到困惑的是,尽管 Python 的所有变量都可能是对象并且这些变量的所有属性都可能是对象,但这是有限制的。我的意思是,对于一个普通的类,结构通常是这样的:

myclass -> classobj -> type

如果您在控制台中尝试此操作,您可以看到:

>> class A:
.. pass
..

>> print type(A)
<type 'classobj'>
>> print type(type(A))
<type 'type'>

但是如果你尝试比type更深入,你只会得到typetype 是 Python 中所有对象的基础对象。

>> print type(type(type(A)))
<type 'type'>
>> print type(type(type(type(type(A)))))
<type 'type'>

您不仅获得了相同的基类/对象类型,而且还获得了 A 的类实例的相同类型实例,因此尽管您可以无限递归函数 type(即 type(type(type(type(... ))))),你不会去任何地方(即不探索无限内存的无底洞。)

>> id(type(type(type(A)))
505578544
>> id(type(type(type(type(A))))
505578544

同样的原则适用于 Python 中的所有对象以及 Python 中对象的所有属性,因为它们也是对象,但它们都是有限的。

回答您之前的一个问题,

foo.__call__ is the same instance of 'method-wrapper' as foo.__call__.__call__

所以没有什么能阻止你用 foo.__call__.__call__.__call__...

Python 在 foo.__call__ 中给了你一个实例给“method-wrapper”,并且在那个“method-wrapper”类中有一个函数/变量也叫做 >__call__ 指向该类的同一个实例。

关于python - 万物皆对象是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26294953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com