Day6
面向对象编程
OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
面向对象的几个核心特性如下
Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定
这个__init__()叫做初始化方法(或构造方法),
来个例子
1 classRole:2
3 def __init__(self, name, role, weapon, life_value=100, money=15000): #构造函数
4
5 #在实例化时做一些类的初始化工作
6
7 self.name = name #实例变量(静态属性)
8
9 self.role =role10
11 self.weapon =weapon12
13 self.life_value =life_value14
15 self.money =money16
17 def shot(self): #类的方法(动态属性)
18
19 print("shooting...")20
21 defgot_shot(self):22
23 print("ah...,I got shot...")24
25 defbuy_gun(self, gun_name):26
27 print("%s just bought %s" %(self.name,gun_name))28
29
30
31 r1 = Role('Alex', 'police', 'AK47') #实例化、初始化一个类
32
33 r1.got_shot()34
35 r1.buy_gun("b51")36
37
38
39 r2 = Role('Jack', 'terrorist', 'B22') #生成一个角色
40
41 r1.buy_gun("AK47")
扩展一下
1 classRole:2 n = 123 #类变量
3 n_list =[]4 def __init__(self, name, role, weapon, life_value=100, money=15000): #构造函数
5 self.name =name6 self.role =role7 self.weapon =weapon8 self.life_value =life_value9 self.money =money10 defshot(self):11 print("shooting...")12 defgot_shot(self):13 print("%s:ah...,I got shot..."%self.name)14 defbuy_gun(self, gun_name):15 print("%s just bought %s" %(self.name,gun_name))16
17 r1 = Role('Alex', 'police', 'AK47') #实例化、初始化一个类
18 r1.got_shot()19 r1.buy_gun("b51")20 r1.name = "Zachary"
21 r1.bullet_protect = True #甚至可以加一个这个属性
22 print(r1.n,r1.name,r1.bullet_protect)23 print(r1.weapon)24 #del r1.weapon
25 #print(r1.weapon)
26 r1.n = "改类变量" #修改了r1的类变量后,r2的不会改变,相当于在r1下创建了一个新的n,而不再是类变量n
27 print("r1:",r1.weapon,r1.n) #修改了r1的类变量后,r2的不会改变
28 r1.n_list.append("fromr1")29 r2 = Role('Jack', 'terrorist', 'B22') #生成一个角色
30 r2.got_shot()31 r2.name = "Zach"
32 print(r2.n,r2.name)33 print("r2:",r2.weapon,r2.n) #修改了r1的类变量后,r2的不会改变
34 r2.n_list.append("fromr1")35 #但是如果这么改
36 Role.n = "ABC"
37 print(r1.n,r2.n)38 print(r2.n_list)39 print(Role.n_list)
析构函数
在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作,如关闭数据库链接打开的临时文件
1 classRole:2 n = 123 #类变量
3 n_list =[]4 def __init__(self, name, role, weapon, life_value=100, money=15000): #构造函数
5 self.name =name6 self.role =role7 self.weapon =weapon8 self.life_value =life_value9 self.money =money10 def __del__(self):11 print("%s 彻底死了...."%self.name)12
13 defshot(self):14 print("shooting...")15 defgot_shot(self):16 print("%s:ah...,I got shot..."%self.name)17 defbuy_gun(self, gun_name):18 print("%s just bought %s" %(self.name,gun_name))19
20 r1 = Role('Zach', 'police', 'AK47') #实例化、初始化一个类
21 r1.buy_gun("gun")22 r1.got_shot()23 r2 = Role('Jack','torriost','uzi')24 r2.got_shot()25 r2.got_shot()
私有属性、方法
在属性、方法前面加入__可以让其变为私有的
这时候要访问属性,只能通过方法来访问
1 classRole:2 def __init__(self, name, role, weapon, life_value=100, money=15000): #构造函数
3 self.name =name4 self.role =role5 self.weapon =weapon6 self.__life_value =life_value7 self.money =money8 defshow_status(self):9 print("name:%s weapon:%s life:%s"%(self.name,10 self.weapon,11 self.__life_value))12 defshot(self):13 print("shooting...")14 defgot_shot(self):15 self.__life_value -= 50
16 print("%s:ah...,I got shot..."%self.name)17 defbuy_gun(self, gun_name):18 print("%s just bought %s" %(self.name,gun_name))19
20 r1 = Role("Zach","Police","Ak47")21 r1.show_status()22 r1.got_shot()23 r1.show_status()