所以说我正在扩展一个名为Frame的对象(在'tkinter'中找到),如下所示,
class GraphRegion(Frame):
def __init__(self, master):
Frame.__init__(self,master)
现在,我知道为什么需要'掌握'。为什么Frame。 __ init __ 需要'self'? “自我”不指向GraphRegion吗?这实际上是什么告诉对象'Frame'?是否将GraphRegion创建为“Frame”类型?
答案 0 :(得分:3)
因为Frame.__init__
是未绑定的方法。
仅在实例上查找方法会生成绑定方法,有一个实例将self
绑定到。由于Frame.__init__
未绑定,因此需要明确传入第一个参数,即实例。
您无法以其他方式访问该方法; self.__init__
GraphRegion.__init__
与self
绑定。因此,如果您想重复使用Frame.__init__
版本,则必须直接从Frame
请求它。
基本上,当用GraphRegion(应用程序)创建一个新实例时,Python会这样做:
GraphRegion
类创建一个新的空实例,让它给它一个临时名称new
。new.__init__(application)
。__init__
属性。它在实例本身上找不到,因此Python会在下一个类中查看。__init__
。在类中查找属性时,如果属性支持descriptor protocol,则会执行额外的步骤: binding 。 __init__
绑定到实例,生成绑定方法。application
。__init__
函数,传入new
(实例)和application
。GraphRegion.__init__
内你有self
(new
个实例)和master
(绑定到同一个application
绑定的东西),但你也需要调用Frame.__init__
方法。__init__
上查找Frame
直接在类上发生,因此描述符协议没有要绑定的实例。将返回未绑定方法。Frame.__init__
无法传递绑定实例。您需要明确传递它。使用新式类时,您还可以使用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__
方法。