【问题标题】:Do objects have a copy of their class methods?对象是否有其类方法的副本?
【发布时间】:2020-09-18 04:54:35
【问题描述】:

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

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

注意:

dir() 函数返回指定对象的所有属性和方法,不带值。

delattr()方法用于从对象中删除命名属性,需要对象的事先许可。

【问题讨论】:

    标签: python class object methods instance


    【解决方案1】:

    我的结论是这样的:

    当我们使用variableName = className(args)实例化一个类时,它会在内存中创建一个对象,使用init方法(构造函数)初始化它的所有数据属性,并将对象数据的内存地址返回给对象变量名,我们调用它作为一个例子。

    对象数据包含两个东西

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

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

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

    【讨论】:

    • 你会在这个心智模型上走得很远。有一些细节要补充。例如,当您执行instanceName.method() 时,self=instanceName 不会直接传递给类__dict__ 中的函数method。每次访问instanceName.method 时,都会在className.method 的基础上从头开始构建一个全新的可调用对象。那个全新的可调用对象的行为就像self=instanceName
    • 另外,没有“内存属性”。当Python在实例的__dict__中找不到属性时,会去其他地方搜索,从实例的类开始。
    • @timgeb 哦!所以对象没有内存属性。因此,它只是在实例的类中搜索被调用的方法,如果没有找到,它会在其父类中搜索它。这就是继承的工作原理吗?
    • @timgeb 你的回答很有见地。谢谢?。
    • "继承是这样工作的吗?" Pretty much
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-29
      • 2014-10-31
      • 2018-02-13
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多