Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python中的函数/方法需要self作为参数?_Python_Methods_Self - Fatal编程技术网

为什么python中的函数/方法需要self作为参数?

为什么python中的函数/方法需要self作为参数?,python,methods,self,Python,Methods,Self,我可以理解为什么局部变量(self.x)需要它,但为什么nessecary是函数中的参数?你有没有别的东西可以放在那里而不是放在自己的身上 请尽可能多地用外行术语解释,我从来没有受过像样的编程教育。这就是Python实现面向对象编程的工作原理——以实例作为第一个参数调用实例的方法(所谓的绑定方法) 除了实例的变量(self.x)之外,您还可以将其用于任何其他用途,例如调用另一个方法(self.other\u method()),将此实例作为参数完全传递给其他对象(mod.some\u函数(3,s

我可以理解为什么局部变量(self.x)需要它,但为什么nessecary是函数中的参数?你有没有别的东西可以放在那里而不是放在自己的身上


请尽可能多地用外行术语解释,我从来没有受过像样的编程教育。

这就是Python实现面向对象编程的工作原理——以实例作为第一个参数调用实例的方法(所谓的绑定方法)

除了实例的变量(
self.x
)之外,您还可以将其用于任何其他用途,例如调用另一个方法(
self.other\u method()
),将此实例作为参数完全传递给其他对象(
mod.some\u函数(3,self)
),或者使用它在此类的超类中调用此方法(
返回super>)(ThisClass,self)。此方法()


您也可以给它一个完全不同的名称。使用
小马
而不是
自我
也同样有效。但是,出于明显的原因,您不应该这样做。

在方法中使用
自我
作为第一个引用完全是惯例

您可以将其称为其他名称,即使在同一类中不一致:

class Foo(object):
    def __init__(notself, i):
        notself.i=i             # note 'notself' instead of 'self'

    def __str__(self):
        return str(self.i)      # back to the convention   

f=Foo(22)

print f

请不要这样做。别人可能会读到你的代码(或者你自己在读它之后)感到困惑。

< P>如果你考虑到,每种编程语言都会这样做,或者至少是最常用的语言,如PASCAL、C++或java做的。除此之外,在大多数编程语言中,
this
关键字是假定的,而不是作为参数传递的。考虑这些语言中的函数指针:它们与方法指针不同。

帕斯卡:

function(a: Integer): Integer;
vs

后者考虑了<代码>自身>代码>(是的,它被命名为代码>自我/代码>,但它是一个隐含的指针,像<代码> C++中的< <代码>,而Python <代码>“自我/代码>是明确的”。 C++:

vs

与Pascal的差异,在C++中,必须指定拥有该方法的类。无论如何,这个方法指针声明声明了一个函数是否需要一个

this

但是巨蟒很认真,就像奎丘亚人很认真地对待他们的阿玛苏威,阿玛伊利,阿玛凯莱一样:

Explicit is better than implicit.
因此,这就是为什么您可以明确地看到
self
参数(当然,必须编写它),例如实例方法和
@classmethod
s(尽管它通常在那里被称为
cls
,因为它的目的是动态地了解类而不是实例)。Python不假定方法中必须存在
this
self
关键字(因此,名称空间中只有真正的变量-请记住,您不会被迫将它们命名为
self
cls
,尽管这是通常和预期的)

最后,如果您得到:

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语言都有语法上的糖分(奇怪的标准,是吧?)。

默认情况下,在类的命名空间中声明的每个函数都假定其第一个参数是对该类实例的引用。(其他类型的函数用
@classmethod
@staticmethod
修饰以改变这种假设。)这些函数称为方法。按照惯例,Python程序员将第一个参数命名为
self
,但Python并不在乎您如何称呼它。调用方法时,必须提供该引用。例如(将
self
替换为
foobar
,以证明
self
不是必需的名称):

Python提供了一些语法糖,通过让您调用绑定方法而不是函数本身,使对象和在其上调用的方法之间的链接更加明显。也就是说,
a.somefunc(3)
a.somefunc(a,3)
是等价的。在Python术语中,
A.somefunc
是一个未绑定的方法,因为调用它时仍然需要一个实例:

f = A.somefunc
print f(a, 3)
相比之下,
a.somefunc
被称为绑定方法,因为您已经提供了要用作第一个参数的实例:

f = a.somefunc
print f(3)

名称
self
是惯例;但是如果你真的想,你可以炫耀这个惯例,使用不同的名称。看看这里有一长串可能重复的名称:,
self
指的是对象本身。
x(param, param2, ..., named=param, named2=param2, ...)
class A:
    def __init__(foobar):
        foobar.x = 5

    def somefunc(foobar, y):
        print foobar.x + y

a = A()
print A.somefunc(a, 3)   # Prints 8
f = A.somefunc
print f(a, 3)
f = a.somefunc
print f(3)