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.getName
和 self=Harry
。
另一方面,当您在 class 级别访问 getName
时,不会构造新的可调用对象。
我得出的结论是:
当我们使用 variableName = className(args)
实例化一个 class 时,它会在内存中创建一个对象,使用 init
方法(构造函数)和 returns 内存初始化其所有数据属性对象数据的地址到对象变量名,我们称它为实例。
对象数据包含两件事
- 数据属性及其值
- 其 class 方法的内存引用。
每当我们通过 instanceName.method()
调用对象上的任何方法时,它都会引用 class 方法并传递由 self
参数指定的对象数据本身并执行它访问或修改对象数据。
因此,内存中的对象仅包含数据属性值而不是其 class 方法的副本,而仅包含它们的内存引用。
我想知道 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.getName
和 self=Harry
。
另一方面,当您在 class 级别访问 getName
时,不会构造新的可调用对象。
我得出的结论是:
当我们使用 variableName = className(args)
实例化一个 class 时,它会在内存中创建一个对象,使用 init
方法(构造函数)和 returns 内存初始化其所有数据属性对象数据的地址到对象变量名,我们称它为实例。
对象数据包含两件事
- 数据属性及其值
- 其 class 方法的内存引用。
每当我们通过 instanceName.method()
调用对象上的任何方法时,它都会引用 class 方法并传递由 self
参数指定的对象数据本身并执行它访问或修改对象数据。
因此,内存中的对象仅包含数据属性值而不是其 class 方法的副本,而仅包含它们的内存引用。