Python中的'Self'与C#/C++中的'This
我对Python的面向对象编程(OOP)概念还不是很熟悉,所以我想知道Python中的self
和C++/C#中的this
关键字在功能上有没有什么相似之处。
2 个回答
是的,它们实现的是相同的概念。它们的作用是提供一个指向类实例的引用,也就是调用方法时所用的那个实例。
可能会有人更聪明,能指出它们之间的真正区别,但对于普通用户来说,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
装饰器(参考)。
self
和 this
的作用是一样的,只不过 self
需要明确地传递进来。
Python 是一种动态语言,所以你可以给你的类添加成员。使用 self
明确地告诉你是在本地作用域、实例作用域还是类作用域中工作。
就像在 C++ 中一样,你可以明确地传递实例。在下面的代码中,#1
和 #2
实际上是一样的。因此,你可以像使用普通函数一样使用这些方法,没有任何歧义。
class Foo :
def call(self) :
pass
foo = Foo()
foo.call() #1
Foo.call(foo) #2
根据 PEP20 的说法:明确比隐含要好
。
需要注意的是,self
不是一个关键字,你可以随意命名它,它只是一种约定。