python的self和c++的this
- 最近在准备秋招,同时复习python和c++,在面对对象编程时发现两个语言的一些知识点有一些相似性,因此想把两个语言的共同性用自己的理解讲出来。
python的self
很多时候我们定义一个类时会发现类里面的成员函数参数前都会有一个self,但是当我们实例化对象后调用这个函数,却只用传入一个实参,直接跳过了self,如下例子,这是为什么呢?self到底是什么?
class Cat:
def say(self, name):
print(name)
if __name__ == '__main__':
c = Cat()
c.say("666")
下面我们来深入的探究一下self
class Cat:
def say(self, name):
print(name)
if __name__ == '__main__':
c = Cat()
print(Cat.say)
print(c.say)
'''
<function Cat.say at 0x000002553A3A8310>
<bound method Cat.say of <__main__.Cat object at 0x000002553A3A5A30>>
'''
我们在调用发现,这个self占用一个形参位置的情况只有在你实例化一个对象后调用此成员函数才会出现这种情况,并且上面这个例子我们可以发现用普通类调用say和实例化对象类,打印出的东西时不一样的,对象调用函数时一个bound method 即说明这是一个绑定了一个对象的方法。
我们再看这个self到底是什么?
class Cat:
def say(self, name):
print(name)
print(self)
if __name__ == '__main__':
c = Cat()
print(c)
c.say("666")
'''
<__main__.Cat object at 0x0000024A6C6B5A30>
666
<__main__.Cat object at 0x0000024A6C6B5A30>
'''
我们在这个例子,直接打印实例化的对象,并且在成员函数中打印了self,发现打印出来的东西是一样的,说明python在调用类方法的时候,函数的第一个参数默认会指向你实例化的对象,之后才是你传入的实参,因此这个self相当于是一个默认的占位符,而这个self这个形参的名字是随便取的。
至于这个self到底有什么用呢?用我的理解就是可以在一个类中进行变量共享
class Cat:
name1 = "777"
def say(self, name):
print(name)
self.name1 = 999
print(self)
def say2(self):
print(self.name1)
print(self.name)
if __name__ == '__main__':
c = Cat()
c.name = "666"
print(c.__dict__)
c.say("666")
c.say2()
'''
{'name': '666'}
666
<__main__.Cat object at 0x000001EB6B265A30>
999
666
'''
例如我们通过上面这个例子可以发现我们可以在类的任意地方用self这个桥梁进行变量的共享,这个变量的数值是存在
__dict__
这个字典里面的,这样的话我们可以在类的任意成员函数中通过self.xxx的方式拿到数据
c++的this指针
this指针指向被调用的成员函数所属的对象
例子如下:
#include <iostream>
using namespace std;
class Cat{
public:
int a;
void print_object()
{
cout << this;
}
};
int main(){
Cat cat;
cout << &cat << endl;
cat.print_object();
return 0;
}
/*
0x2acc5ffadc
0x2acc5ffadc
*/
我们分别在main函数和成员函数中打印对象地址和this指针,可以看到this指针的值和对象的地址是相同的,因此c++的this指针其实和python的self有点类似,但是不同的是c++的this指针是一个关键字,python的self是约定俗成的。