扩展对象时使用self的原因(Python)

扩展对象时使用self的原因(Python),python,object,self,extending,Python,Object,Self,Extending,假设我正在扩展一个名为Frame的对象(位于“tkinter”中),如下所示 class GraphRegion(Frame): def __init__(self, master): Frame.__init__(self,master) 现在,我知道为什么需要“大师”。为什么Frame.\uuuu init\uuuu需要“自我”?“self”不是指GraphRegion吗?这到底是什么在告诉对象“框架”?是否将GraphRegion创建为类型“Frame”?因为F

假设我正在扩展一个名为Frame的对象(位于“tkinter”中),如下所示

class GraphRegion(Frame):

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

现在,我知道为什么需要“大师”。为什么Frame.\uuuu init\uuuu需要“自我”?“self”不是指GraphRegion吗?这到底是什么在告诉对象“框架”?是否将GraphRegion创建为类型“Frame”?

因为
Frame.\uuu init\uuu
是一个未绑定的方法

只有在实例上查找方法才能生成绑定方法,有一个实例要绑定到
self
。因为
Frame.\uuuu init\uuuu
是未绑定的,所以需要显式地传入第一个参数,即实例

否则,您无法访问该方法
self.\uuuu init\uuu
GraphRegion.\uuuu init\uuu
绑定到
self
。因此,如果您想重用
框架。\uuuuu init\uuuu
版本,您必须直接从
框架
请求它

本质上,当使用GraphRegion(application)创建新实例时,Python会执行以下操作:

  • Python为
    GraphRegion
    类创建一个新的空实例,让我们给它一个临时名称
    new
  • Python希望初始化该实例,因此它调用
    new.\uu init\uuu(应用程序)
  • 将查找
    \uuuu init\uuuu
    属性。在实例本身上找不到该类,因此Python接下来将查看该类
  • \uuuu init\uuuu
    可在类中找到。在类上查找属性时,如果该属性支持,则会执行额外的步骤:绑定<代码>\uuuu init\uuuu绑定到实例,生成绑定方法
  • Python调用绑定方法,传入
    应用程序
  • 绑定方法调用实际的
    \uuuu init\uuu
    函数,传入
    new
    (实例)和
    application
  • 现在,在
    GraphRegion中,\uuuuu init\uuuu
    您既有
    self
    (新的
    实例)又有
    master
    (绑定到与
    应用程序
    绑定到的相同的东西),但是您还需要调用
    框架
  • Frame
    上查找
    \uuuuu init\uuuu
    直接在类上进行,因此描述符协议没有要绑定的实例。返回一个未绑定的方法
  • 调用方法,
    Frame.\uuuu init\uuuu
    无法传递绑定实例。您需要显式地传递它
  • 使用新样式的类时,还可以使用访问超类上的绑定方法。对于只在Python3中工作的
    Tkinter.Frame
    ,在Python2中,整个
    Tkinter
    模块仍然使用旧式类

    对于Python3,这看起来像:

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

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

    ,因为
    Frame.\uuu init\uuu
    是一个未绑定方法

    只有在实例上查找方法才能生成绑定方法,有一个实例要绑定到
    self
    。因为
    Frame.\uuuu init\uuuu
    是未绑定的,所以需要显式地传入第一个参数,即实例

    否则,您无法访问该方法
    self.\uuuu init\uuu
    GraphRegion.\uuuu init\uuu
    绑定到
    self
    。因此,如果您想重用
    框架。\uuuuu init\uuuu
    版本,您必须直接从
    框架
    请求它

    本质上,当使用GraphRegion(application)创建新实例时,Python会执行以下操作:

  • Python为
    GraphRegion
    类创建一个新的空实例,让我们给它一个临时名称
    new
  • Python希望初始化该实例,因此它调用
    new.\uu init\uuu(应用程序)
  • 将查找
    \uuuu init\uuuu
    属性。在实例本身上找不到该类,因此Python接下来将查看该类
  • \uuuu init\uuuu
    可在类中找到。在类上查找属性时,如果该属性支持,则会执行额外的步骤:绑定<代码>\uuuu init\uuuu
    绑定到实例,生成绑定方法
  • Python调用绑定方法,传入
    应用程序
  • 绑定方法调用实际的
    \uuuu init\uuu
    函数,传入
    new
    (实例)和
    application
  • 现在,在
    GraphRegion中,\uuuuu init\uuuu
    您既有
    self
    (新的
    实例)又有
    master
    (绑定到与
    应用程序
    绑定到的相同的东西),但是您还需要调用
    框架
  • Frame
    上查找
    \uuuuu init\uuuu
    直接在类上进行,因此描述符协议没有要绑定的实例。返回一个未绑定的方法
  • 调用方法,
    Frame.\uuuu init\uuuu
    无法传递绑定实例。您需要显式地传递它
  • 使用新样式的类时,还可以使用访问超类上的绑定方法。对于只在Python3中工作的
    Tkinter.Frame
    ,在Python2中,整个
    Tkinter
    模块仍然使用旧式类

    对于Python3,这看起来像:

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

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

    ,因为
    Frame.\uuu init\uuu
    是一个未绑定方法

    只有在实例上查找方法才能生成绑定方法,有一个实例要绑定到
    self
    。因为
    Frame.\uuuu init\uuuu
    是未绑定的,所以需要显式地传入第一个参数,即实例

    否则,您无法访问该方法
    self.\uuuu init\uuu
    GraphRegion.\uuuu init\uuu
    绑定到
    self
    。因此,如果您想重用
    框架。\uuuu init\uuuu
    版本,您必须去请求
    __init__(myobject, master)
    
    class Movie(object):
        def __init__(self, title):
            self.title = title