如果你考虑一下,每种编程语言都会这样做——或者至少,像pascal、c++或java这样最常见的语言都会这样做)。但是,在大多数编程语言中,this关键字是假定的,而不是作为参数传递的。考虑一下这些语言中的函数指针:它们与方法指针不同。在
帕斯卡:function(a: Integer): Integer;
与
^{pr2}$
后者考虑self指针(是的,它的名称是self,但它是一个隐式指针,类似于c++中的this,而pythonself是显式的)。在
C++:typedef int (*mytype)(int a);
与typedef int Anyclass::(*mytype)(int a);
与Pascal的差异,在C++中,必须指定拥有该方法的类。无论如何,这个方法指针声明声明了一个函数与一个不需要this的函数之间的区别。在
但是Python很认真,就像quichua人对待他们的Ama Suway,Ama Llullay,Ama K'ellay一样Explicit is better than implicit.
所以,这就是为什么您看到显式地为实例方法和@classmethod的self参数(当然必须编写它)(尽管它通常被称为cls,因为它的目的是动态地知道类而不是实例)。Python不假定方法中必须存在this或self关键字(因此,名称空间只有真正的变量-请记住,您不必将它们命名为self或{},尽管这是通常和预期的)。在
最后,如果您得到:x = AClass.amethod #unbound method
你必须称之为x(aninstance, param, param2, ..., named=param, named2=param2, ...)
而得到的结果是:x = anInstance.method #bound method, has `im_self` attribute set to the instance.
必须称为:x(param, param2, ..., named=param, named2=param2, ...)
是的,self在参数列表中是显式的,因为它不假定关键字或“后门”必须存在,但在参数列表中不存在,因为每个OOP语言都有语法糖分(奇怪的标准,哈?)。在