python 的self 和 C#的this有什么区别呢

'Self' of python vs 'this' of cpp/c#

我对python的oop概念非常熟悉,所以我想知道python的self的功能与cpp/c的this关键字的功能有任何相似之处。


selfthis的目的相同,但必须明确接收self的目的除外。

python是一种动态语言。这样您就可以向类中添加成员。使用self显式地允许您定义是否在本地范围、实例范围或类范围内工作。

与C++一样,可以显式传递实例。在下面的代码中,#1#2实际上是相同的。因此,您可以将方法用作普通函数,而不产生歧义。

1
2
3
4
5
6
7
class Foo :
    def call(self) :
        pass

foo = Foo()
foo.call() #1
Foo.call(foo) #2

来自PEP20:Explicit is better than implicit

注意,self不是关键字,您可以随意调用它,它只是一种约定。


是的,它们实现了相同的概念。它们的目的是为类的实例提供一个句柄,在该实例上执行方法。或者,在其他措词中,是调用方法的实例。

也许有人会更聪明地指出真正的差异,但是对于一个非常正常的用户来说,Python EDCOX1(0)基本上等同于C++ EDCOX1(1)。

然而,在python中对self的引用更为明确。例如,它显式地出现在方法声明中。对被调用对象的实例执行的方法调用必须使用self显式执行。

即:

1
2
3
4
5
6
def do_more_fun(self):
  #haha
  pass

def method1(self, other_arg):
  self.do_more_fun()

这在C++中看起来更像:

1
2
3
4
5
6
7
8
void do_more_fun(){
  //haha
};

void method1(other_arg){
  do_more_fun();
  // this->do_more_fun(); // also can be called explicitly through `this`
}

正如Juanchopanza指出的那样,thisc++中的一个关键字,因此不能使用其他名称。这与另一个区别是一致的,在c++方法中不能省略传递this。唯一的方法就是让它静止。这也适用于python,但在不同的约定下。在python中,第一个参数总是隐式地将引用分配给self。所以你可以选择任何你喜欢的名字。为了防止出现这种情况,并且能够在python中生成静态方法,需要使用@staticmethoddecorator(reference)。