day06 面向对象编程
面向对象:
面向对象:
世界万物,皆可分类
世界万物,皆为对象
只要是对象,就肯定属于某种品类
只要是对象,就肯定有属性
特性:
多态:
一个统一的接口,多种实现
例如: 一个公司 有程序员,销售,前台,但是他们都属于员工
老板只需说工作, 那么下面的员工就开始各自的工作,不管你是程序猿,前台 都会各自做各自的事情
定义语法:
#定义一个狗类型
class Dog:
def bulk(self): #会叫
print("汪汪汪")
#创建一个狗
dog1 = Dog()
#创建多个狗:
dog2 = Dog()
dog3 = Dog()
#就为了传名字
构造函数:
#在实际化时做一些类的初始化的工作.
就是把 r1 这个变量名传进去类里了
self 就是你创建的对象的变量名
实践:
1 class Role: 2 def __init__(self,name,role,weapon,life_value=100,money=15000): 3 self.name = name 4 self.role = role 5 self.weapon = weapon 6 self.life_value = life_value 7 self.money = money 8 def shot(self): 9 print("shotting ...") 10 def got_shot(self): 11 print("ah .... ,i got shot ...") 12 def buy_gun(self,gun_name): 13 print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name)) 14 r1 = Role("Alex","F","ak-47") 15 r2 = Role("小明","T","m4-a1") 16 r1.buy_gun("m4") 17 r2.got_shot()
运行结果:
实例变量:
也就是静态属性:
方法:
也就是动态属性
类变量:
新加变量:
默认去找实例变量,找不到实例变量才去找类变量
r1添加变量,r2 实例化不变,因为是r1 添加变量
改变类变量,如果实例里没有那个变量,那么就会跟着改变
对于list 会导致所有的改变
实验:
验证 字符串及其他变量的区别:
1 class Role: 2 n = 123 3 n_lsit = [] 4 def __init__(self,name,role,weapon,life_value=100,money=15000): 5 self.name = name 6 self.role = role 7 self.weapon = weapon 8 self.life_value = life_value 9 self.money = money 10 def shot(self): 11 print("shotting ...") 12 def got_shot(self): 13 print("ah .... ,i got shot ...") 14 def buy_gun(self,gun_name): 15 print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name)) 16 r1 = Role("Alex","F","ak-47") 17 r2 = Role("小明","T","m4-a1") 18 # r1.buy_gun("m4") 19 # 20 # r2.got_shot() 21 print("r1",r1.n,r1.n_lsit) 22 print("r2",r2.n,r2.n_lsit) 23 r1.n = "heh1" 24 r2.n = "hah2" 25 print("Class:",Role.n,Role.n_lsit) 26 r1.n_lsit.append("r11") 27 print("r1",r1.n,r1.n_lsit) 28 r2.n_lsit.append("r22") 29 print("r2",r2.n,r2.n_lsit) 30 print("Class:",Role.n,Role.n_lsit) 31 print("r1",r1.n,r1.n_lsit)
运行结果:
得出:
1 实例变量: 就是每个实例的特有属性
2 类变量: 就是大家共用的属性,节省内存开销, 如下两个的区别即是
析构函数:
在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作,比如:
1 关闭数据库连接
2 关闭打开的临时文件
写一个:
如果在这之前就del 那么就会提前执行,也就是这个会在一个实例销毁时执行的
私有属性:
例如生命值,只有自己可以访问,别人不能调用也不能访问:
把这个变量隐藏了,对外不可用
外面想要查看,那么就定义一个函数然后在外面来调用这个函数即可
当然外面的不能访问,必然不能修改,所以想修改就要在里面定义好修改的方式,如下:
私有方法:
同上,把对应的方法前加__ 就不能在外面调用了,只能在里面调用:
实践 私有属性:
1 class Role: 2 n = 123 3 n_lsit = [] 4 def __init__(self,name,role,weapon,life_value=100,money=15000): 5 self.name = name 6 self.role = role 7 self.weapon = weapon 8 self.__life_value = life_value 9 self.money = money 10 def shot(self): 11 print("shotting ...") 12 def got_shot(self): 13 print("ah .... ,i got shot ...") 14 def show_life_value(self): 15 print("{_name}'s life value is {_life_value}".format(_name=self.name, 16 _life_value=self.__life_value)) 17 def buy_gun(self,gun_name): 18 print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name)) 19 r1 = Role("Alex","F","ak-47") 20 r2 = Role("小明","T","m4-a1") 21 r1.buy_gun("m4") 22 r2.got_shot() 23 r1.show_life_value() 24 r2.show_life_value()
实践 私有方法:
同上,如果在外面调用此方法就会提示错误:
正确方式就是在类里定义另一个方法来调用这个方法:
1 class Role: 2 n = 123 3 n_lsit = [] 4 def __init__(self,name,role,weapon,life_value=100,money=15000): 5 self.name = name 6 self.role = role 7 self.weapon = weapon 8 self.__life_value = life_value 9 self.money = money 10 def shot(self): 11 print("shotting ...") 12 def __got_shot(self): 13 print("ah .... ,i got shot ...") 14 self.__life_value -= 50 15 def show_life_value(self): 16 print("{_name}'s life value is {_life_value}".format(_name=self.name, 17 _life_value=self.__life_value)) 18 def buy_gun(self,gun_name): 19 print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name)) 20 def out_shot(self): 21 print("调用里面的私有方法被射中...") 22 self.__got_shot() 23 r2 = Role("小明","T","m4-a1") 24 r2.out_shot() 25 r2.show_life_value()
封装 就是把实现的方式内部用私有方法,私有变量实现
继承
写一个大类:
class People:
写一个男人:
增加新功能,并先调用父类方法:
这就等于重构了父类的方法
创建一个woman:
实践:
1 class People: 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 def eat(self): 6 print("{_name} is eatting ...".format(_name=self.name)) 7 def sleep(self): 8 print("{_name} is sleepping ...".format(_name=self.name)) 9 class Man(People): 10 def piao(self): #添加新的方法,这个方法只能是这个类来用 11 print("{_name} can piaoing ...".format(_name=self.name)) 12 def sleep(self): #修改父类里的方法,添加功能,实现个性化 13 People.sleep(self) 14 print("给睡觉添加新的功能") 15 class Woman(People): 16 def sheng(self): #添加新的方法,这个方法只能是这个类来用 17 print("{_name} can shenghaizi ...".format(_name=self.name)) 18 m1 = Man("小明",22) 19 w1 = Woman("小花",18) 20 print("m1") 21 m1.sleep() 22 print("w1") 23 w1.sleep() 24 print("m1") 25 m1.piao() 26 print("w1") 27 w1.sheng()
子类中的初始化:
对构造函数进行重构:
父类的所有参数都要写一遍,写完后面加自己的初始化变量
下面功能一样: 更方便一些。当大类修改了后子类不需要修改
类:
新式和经典的区别就是新式和经典的多继承不一样了
多继承, python 支持, 有的语言支持,有的语言不支持
实践:
1 class People: 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 def eat(self): 6 print("{_name} is eatting ...".format(_name=self.name)) 7 def sleep(self): 8 print("{_name} is sleepping ...".format(_name=self.name)) 9 class Action(object): 10 def make_friends(self,object): 11 print("{_name} is making from {_obj_name}".format(_name=self.name, 12 _obj_name=object.name)) 13 class Man(People,Action): 14 def piao(self): #添加新的方法,这个方法只能是这个类来用 15 print("{_name} can piaoing ...".format(_name=self.name)) 16 def sleep(self): #修改父类里的方法,添加功能,实现个性化 17 People.sleep(self) 18 print("给睡觉添加新的功能") 19 class Woman(People): 20 def sheng(self): #添加新的方法,这个方法只能是这个类来用 21 print("{_name} can shenghaizi ...".format(_name=self.name)) 22 m1 = Man("小明",22) 23 w1 = Woman("小花",18) 24 m1.make_friends(w1)
扩展版:
1 #!/usr/bin/env python3 2 # Author: Shen Yang 3 class People: 4 def __init__(self,name,age): 5 self.name = name 6 self.age = age 7 def eat(self): 8 print("{_name} is eatting ...".format(_name=self.name)) 9 def sleep(self): 10 print("{_name} is sleepping ...".format(_name=self.name)) 11 class Action(object): 12 def make_friends(self,object): 13 print("{_name} is making from {_obj_name}".format(_name=self.name, 14 _obj_name=object.name)) 15 self.firends.append(object) 16 def pay_money(self,object): 17 print("{_name} giveing {_obj_name} {_money} money".format(_name=self.name, 18 _obj_name=object.name, 19 _money=self.money)) 20 class Man(People,Action): 21 firends = [] 22 def __init__(self,name,age,money): 23 super(Man,self).__init__(name,age) 24 self.money = money 25 def piao(self): #添加新的方法,这个方法只能是这个类来用 26 print("{_name} can piaoing ...".format(_name=self.name)) 27 def sleep(self): #修改父类里的方法,添加功能,实现个性化 28 People.sleep(self) 29 print("给睡觉添加新的功能") 30 class Woman(People): 31 def sheng(self): #添加新的方法,这个方法只能是这个类来用 32 print("{_name} can shenghaizi ...".format(_name=self.name)) 33 m1 = Man("小明",22,6800) 34 w1 = Woman("小花",18) 35 m1.make_friends(w1) 36 m1.pay_money(w1) 37 w1.name ="小花花" 38 print(m1.firends[0].name)
多继承的顺序问题:
新式类 :
只继承第一个 的初始化__init__
构造方法查找顺序:
1 广度优先 先找同一级的同一级的没有才往更上一级查找
2 深度优先 查找上级,上级没有就会往更上一级查找
python3 中的经典类和新式类都是广度优先:
python2 的经典类是按 深度优先 继承,新式类是按 广度优先 继承。。。。。。
这就是最大区别
object 是所有类的类:
class SchoolMember(object):
写一个学校,员工,学生的对象程序:
1 #!/usr/bin/env python3 2 # Author: Shen Yang 3 #object 是所有类的类: 4 class School(object): 5 def __init__(self,name,addr): 6 self.name = name 7 self.addr = addr 8 self.students = [] 9 self.staffs = [] 10 def enroll(self,stu_obj): 11 print("为{_stu_obj} 办理了入学手续。。。".format(_stu_obj=stu_obj.name)) 12 self.students.append(stu_obj) 13 def hire(self,staff_obj): 14 print("雇佣了新员工 {_staff_obj}".format(_staff_obj=staff_obj.name)) 15 self.staffs.append(staff_obj) 16 class SchoolMember(object): 17 def __init__(self,name,age,sex): 18 self.name = name 19 self.age = age 20 self.sex = sex 21 def tell(self): 22 pass 23 class Student(SchoolMember): 24 def __init__(self,name,age,sex,stu_id,grade): 25 super(Student,self).__init__(name,age,sex) 26 self.stu_id = stu_id 27 self.grade = grade 28 def tell(self): 29 print(''' 30 ----- info of Student: {_name} ----- 31 Name:{_name} 32 Age:{_age} 33 Sex:{_sex} 34 Stu_id:{_stu_id} 35 Grade:{_grade} 36 '''.format(_name=self.name,_age=self.age,_sex=self.sex,_stu_id=self.stu_id,_grade=self.grade)) 37 def pay_tuition(self,amount): 38 print("{_name} has paid tuition {_amount}".format(_name=self.name,_amount=amount)) 39 class Teacher(SchoolMember): 40 def __init__(self,name,age,sex,salary,coure): 41 super(Teacher,self).__init__(name,age,sex) 42 self.salary = salary 43 self.coure = coure 44 def tell(self): 45 print(''' 46 ----- info of Teacher: {_name} ----- 47 Name:{_name} 48 Age:{_age} 49 Sex:{_sex} 50 Salary:{_salary} 51 Coure:{_coure} 52 '''.format(_name=self.name,_age=self.age,_sex=self.sex,_salary=self.salary,_coure=self.coure)) 53 def teach(self): 54 print("{_name} has teach {_coure}".format(_name=self.name,_coure=self.coure)) 55 #初始化一个学校 56 school = School("老男孩","沙河") 57 #初始化两个教师 58 t1 = Teacher("Oldboy",35,"M",20000,"Linux") 59 t2 = Teacher("Alex",22,"M",3000,"Python") 60 #初始化一个学生 61 s1 = Student("Yang",26,"M",1001,"Python") 62 #让第一个老师打印信息然后开始教课 63 t1.tell() 64 t1.teach() 65 #让第二个老师打印信息 66 t2.tell() 67 #让学生打印信息然后缴费 68 s1.tell() 69 s1.pay_tuition(6888) 70 #学校给学生办理入学手续 71 school.enroll(s1) 72 #打印学校学生 73 print(school.students[0].name) 74 school.hire(t1) 75 school.hire(t2) 76 for i in school.staffs: 77 print(i.name)
多态: