self是什么?
Python的self其实就相当于C++的this指针。由同一个类可以生产无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,那么python就知道需要操作哪个对象的方法了。
1 >>> class Ball:
2 def setName(self,name):
3 self.name = name
4 def kick(self):
5 print('我叫%s,该死的,谁踢我。。。' % self.name)
6
7
8 >>> a = Ball()
9
10 >>> a.setName('球A')
11 >>> b = Ball()
12
13 >>> b.setName('球B')
14
15 >>> a.kick()
16 我叫球A,该死的,谁踢我。。。
17 >>> b.kick()
18 我叫球B,该死的,谁踢我。。。
你听说过Python的魔法方法吗?
python的这些具有魔法的方法,总是被双下划线所包围,例如__init__(),即构造方法,也称构造函数,这个方法会在对象被创建时自动调用。其实,实例化对象时是可以传入参数的,这些参数会自动传入__init__()方法中,可以通过重写这个方法来自定义对象的初始化操作
实例:
1 >>> class Ball():
2 def __init__(self,name):
3 self.name = name
4 def kick(self):
5 print('我叫%s,该死的,谁踢我。。。' % self.name)
6
7
8 >>> b = Ball('小土豆')
9 >>> b.kick()
10 我叫小土豆,该死的,谁踢我。。。
公有和私有?python内部采用了一种叫 name mangling(名字改编)的技术
默认上对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问:
1 >>> class Person:
2 name = '亦我飞也'
3
4
5 >>> p = Person()
6 >>> p.name
7 '亦我飞也'
为了实现定义私有变量,只需要在变量名或函数名前加上"__"两个下划线,那么这个函数或变量就会变成私有的了:
私有变量不可以直接由外部访问
1 >>> class Person:
2 __name = '亦我飞也'
3
4
5 >>> p = Person()
6 >>> p.__name
7 Traceback (most recent call last):
8 File "<pyshell#65>", line 1, in <module>
9 p.__name
10 AttributeError: 'Person' object has no attribute '__name'
室友变量可以由内部(内部函数)进行访问
1 >>> class Person:
2 __name = '亦我飞也'
3 def getName(self):
4 return self.__name
5
6
7 >>> p = Person()
8 >>> p.__name
9 Traceback (most recent call last):
10 File "<pyshell#72>", line 1, in <module>
11 p.__name
12 AttributeError: 'Person' object has no attribute '__name'
13 >>> p.getName()
14 '亦我飞也'
其实,name mangling(名字改编)技术,只是把双下划线开头的变量进行了改名而已。实际上在外部使用“_类名__变量名“即可访问双下划线开头的私有变量了:
1 >>> p._Person__name
2 '亦我飞也'