扩展对象时的自我原因(Python)

时间:2014-08-03 00:24:07

标签: python object self extending

所以说我正在扩展一个名为Frame的对象(在'tkinter'中找到),如下所示,

class GraphRegion(Frame):

    def __init__(self, master):
        Frame.__init__(self,master)

现在,我知道为什么需要'掌握'。为什么Frame。 __ init __ 需要'self'? “自我”不指向GraphRegion吗?这实际上是什么告诉对象'Frame'?是否将GraphRegion创建为“Frame”类型?

2 个答案:

答案 0 :(得分:3)

因为Frame.__init__未绑定的方法

仅在实例上查找方法会生成绑定方法,有一个实例将self 绑定到。由于Frame.__init__未绑定,因此需要明确传入第一个参数,即实例。

您无法以其他方式访问该方法; self.__init__ GraphRegion.__init__self绑定。因此,如果您想重复使用Frame.__init__版本,则必须直接从Frame请求它。

基本上,当用GraphRegion(应用程序)创建一个新实例时,Python会这样做:

  1. Python为GraphRegion类创建一个新的空实例,让它给它一个临时名称new
  2. Python想要初始化实例,因此它调用new.__init__(application)
  3. 查找__init__属性。它在实例本身上找不到,因此Python会在下一个类中查看。
  4. 在课堂上找到了
  5. __init__。在类中查找属性时,如果属性支持descriptor protocol,则会执行额外的步骤: binding __init__绑定到实例,生成绑定方法
  6. Python调用绑定方法,传入application
  7. 绑定方法调用实际的__init__函数,传入new(实例)和application
  8. 现在,在GraphRegion.__init__内你有selfnew个实例)和master(绑定到同一个application绑定的东西),但你也需要调用Frame.__init__方法。
  9. __init__上查找Frame直接在类上发生,因此描述符协议没有要绑定的实例。将返回未绑定方法
  10. 调用方法时,Frame.__init__无法传递绑定实例。您需要明确传递它。
  11. 使用新式类时,您还可以使用super()访问超类上的绑定方法。对于只适用于Python 3的Tkinter.Frame,在Python 2中,整个Tkinter模块仍然使用旧式类。

    对于Python 3,它看起来像:

    class GraphRegion(Frame):
        def __init__(self, master):
            super().__init__(master)
    

    但是,如上所述,在Python 2中使用Tkinter时,您唯一的选择是直接引用直接从Frame类检索的未绑定方法。

答案 1 :(得分:0)

虽然Martjin的答案很棒,但我会扩展它,在某些情况下,让我们说,"较低级别"术语

基本上,无论何时创建新的GraphRegion对象(myobject = GraphRegion(master)),都会调用__init__,新对象作为第一个参数(self)和master参数作为第二个参数。

基本上,如果你这样做:

myobject = GraphRegion(master)

__init__被称为这样:

__init__(myobject, master)

这是因为您经常要将属性分配给对象的特定实例,而self允许您这样做。例如,如果我有一个类Movie,其中每个实例都有自己的标题,我会像这样使用self

class Movie(object):
    def __init__(self, title):
        self.title = title

这样,Movie的每个实例都可以拥有它自己的标题。

现在,每当您运行Frame.__init__(self, master)时,__init__函数通常需要修改您正在创建的GraphRegion类的特定实例(您正在创建的对象),以及self是该实例,因此您将其传递给__init__方法。