Python中的'Self'与C#/C++中的'This

18 投票
2 回答
17893 浏览
提问于 2025-04-17 23:05

我对Python的面向对象编程(OOP)概念还不是很熟悉,所以我想知道Python中的self和C++/C#中的this关键字在功能上有没有什么相似之处。

2 个回答

4

是的,它们实现的是相同的概念。它们的作用是提供一个指向类实例的引用,也就是调用方法时所用的那个实例。

可能会有人更聪明,能指出它们之间的真正区别,但对于普通用户来说,Python 中的 self 基本上相当于 C++ 中的 *this

不过,在 Python 中,self 的引用使用得更加明确。例如,它在方法声明中是明确存在的。而在调用对象实例的方法时,必须明确使用 self

也就是说:

def do_more_fun(self):
  #haha
  pass

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

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

void do_more_fun(){
  //haha
};

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

另外,正如 juanchopanza 指出的那样,this 是 C++ 中的一个关键字,所以你不能用其他名字来代替它。这和另一个区别有关,你不能省略在 C++ 方法中传递 this。唯一的办法是把它设为静态方法。在 Python 中也是如此,但有不同的约定。在 Python 中,第一个参数总是隐式地被赋值为 self 的引用。所以你可以选择任何你喜欢的名字。为了防止这种情况,并能够在 Python 中创建静态方法,你需要使用 @staticmethod 装饰器(参考)。

14

selfthis 的作用是一样的,只不过 self 需要明确地传递进来。

Python 是一种动态语言,所以你可以给你的类添加成员。使用 self 明确地告诉你是在本地作用域、实例作用域还是类作用域中工作。

就像在 C++ 中一样,你可以明确地传递实例。在下面的代码中,#1#2 实际上是一样的。因此,你可以像使用普通函数一样使用这些方法,没有任何歧义。

class Foo :
    def call(self) :
        pass

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

根据 PEP20 的说法:明确比隐含要好

需要注意的是,self 不是一个关键字,你可以随意命名它,它只是一种约定。

撰写回答