gpt4 book ai didi

python - 为什么对实例方法的引用存储在每个实例对象中而不是类对象中?

转载 作者:太空狗 更新时间:2023-10-30 01:49:24 26 4
gpt4 key购买 nike

据我了解,类的每个实例都存储对该实例方法的引用。

我认为,在概念上,一个类的所有实例都具有相同的实例方法。如果是这样,内存节省和逻辑清晰度似乎都表明实例方法应该存储在类对象而不是实例对象中(实例对象通过类对象查找它们;当然,每个实例都有一个对其的引用类(class))。为什么不这样做?

次要问题。为什么不能以类似于实例属性的方式访问实例方法,即通过 __dict__ 或通过其他一些系统属性?有什么方法可以查看(并可能更改)实例方法的名称和引用?

编辑:

糟糕,抱歉。我完全错了。我看到了以下 Python 2 代码,并从中错误地得出实例方法存储在实例中的结论。我不确定它的作用,因为我不使用 Python 2,而且 new 已从 Python 3 中消失。

import new
class X(object):
def f(self):
print 'f'
a = X()
b = X()
def g(self):
print 'g'
# I thought this modified instance method just in a, not in b
X.f = new.instancemethod(g, a, X)

最佳答案

Python 中对象的属性查找非常重要。但是实例方法肯定不会存储在实例对象上!

The default behavior for attribute access is to get, set, or delete the attribute from an object’s dictionary. For instance, a.x has a lookup chain starting with a.__dict__['x'], then type(a).__dict__['x'], and continuing through the base classes of type(a) excluding metaclasses.

( docs )

请注意,可以在实例上存储函数。但这不是实例方法!当解释器查找一个属性并发现它是 (a) 一个函数并且 (b) 在类对象上时,它会自动将它包装在一个传递 self 的绑定(bind)方法对象中。


Is there any way to look at (and perhaps change) the names and the references to instance methods?

好吧,你当然可以在定义之后修改类对象。但我假设您的意思是“您能否使特定实例的x方法做一些不同的事情?”

这是 Python,答案是"is":只需将 a.x 定义为一些新函数。然后您将在查看类(class)之前取回该功能。

不过,当您试图理解代码时,这可能会给您带来很多困惑!

关于python - 为什么对实例方法的引用存储在每个实例对象中而不是类对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9774010/

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