objects 有他们的 class 方法的副本吗?

Do objects have a copy of their class methods?

我想知道 object 是否有其所有 class 方法的副本。所以我创建了一个 class person,定义了一个方法 getName 并创建了一个 object Harry。我使用 dir 函数来检查 class 和 object 是否都在其中存储了 getName 方法,并且它们都返回了 true。然后我打印出 class 和 object 的 getName 方法,它们返回了不同的地址,但我注意到 harry.getName 方法绑定到 person.getName .那么这是否意味着 harry.getName 不是其 class 方法的副本,而只是对其 class 方法的引用。要检查这个使用delattr 方法删除人class 的getName 属性并再次使用dir 来检查它。正如预期的那样,它从 class person 和 object Harry.

中删除了它

所以请检查我的代码并判断我的想法是否正确。

注:

dir()函数returns指定object的所有属性和方法,没有值。

delattr() 方法用于从 object 中删除命名属性,并事先获得 object.

的许可

无需过多讨论 detail,您所观察到的是动态创建的函数,其行为类似于 person.getName,但第一个参数 (self)已经绑定到一个实例。

所以不,对象在其 class 中没有方法的副本。每次访问 Harry.getName 时,都会从头构建一个新的可调用对象("method")。它的行为类似于 person.getNameself=Harry

另一方面,当您在 class 级别访问 getName 时,不会构造新的可调用对象。

我得出的结论是:

当我们使用 variableName = className(args) 实例化一个 class 时,它会在内存中创建一个对象,使用 init 方法(构造函数)和 returns 内存初始化其所有数据属性对象数据的地址到对象变量名,我们称它为实例。

对象数据包含两件事

  1. 数据属性及其值
  2. 其 class 方法的内存引用。

每当我们通过 instanceName.method() 调用对象上的任何方法时,它都会引用 class 方法并传递由 self 参数指定的对象数据本身并执行它访问或修改对象数据。

因此,内存中的对象仅包含数据属性值而不是其 class 方法的副本,而仅包含它们的内存引用。