看完篇你就可以飘起来了
一:实例化过程:
实例化:其实就是以People类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名
class People(object):
def __init__(self, name, sex='F'):
self.name = name
self.sex = sex
def people_name(self):
print('我的名字叫:', self.name)
people = People('范冰冰') # 实例化这个类,此时的people就是类People的实例化对象
people.people_name()
看完以上代码回答三个问题:
1.为什么有__init__ ????
2.__init__(self)里面为什么有self ????
3.__init__(self):中self.name=name,这个self做什么 ????
4.方法def people_name(self):中self做什么 ????
静静的看完下面的内容,你就回明白了~~
实例化的过程:
其实self,就是实例本身(这里的self其实就是people)!你实例化时python会自动把这个实例本身通过self参数传进去。
所以:
初始化一个角色,就需要调用这个类一次:
people1 = People('范冰冰'),生成一个个体,会自动把参数传给People下面的__init__(...)方法
people2 = People('李晨')
虽然我们没有显性的去调用__init__传值,其实类在调用他自己的__init__(…)时,自己帮你给self参数赋值了,
比如:
程序执行people1 = People('范冰冰')时,python的解释器其实干了两件事(回到上面的图片解说):
- 在内存中开辟一块空间指向people1这个变量名
- 调用People这个类并执行其中的__init__(…)方法,相当于People.__init__(people1,'范冰冰','F'),这样就把('范冰冰','F')跟people1关联起来,既然关联起来了,那么我们当然可以用prople1.name,prople1.sex的方式调用了。所以,为实现这种关联,在调用__init__方法时,就必须把r1这个变量也传进去,否则__init__不知道要把那3个参数跟谁关联呀。
- 所以这个__init__(…)方法里的,self.name = name , self.sex= sex就是要把这几个值 存到prople1的内存空间里。
那么:
people_name(self)方法 为什么也还需要self参数么? 不是在初始化角色的时候 ,就已经把角色的属性跟prople1绑定好了么?
people = People('范冰冰')
people.people_name() #等价于:People.people_name(people,”范冰冰")
细心的同学可能发现,我们在调用方法 people_name(self):时,并没有给self传值,假装不存在,不过Python还是会自动的帮你把people赋值给self这个参数,所以啊,你在 people_name(self)方法里面可以随意访问people其他属性(如:self.name,其实就是是等价于people.name方式去调用)
最后:
- “实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象了, 这个对象就叫做实例
- 刚才定义的这个类体现了面向对象的第一个基本特性,封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容