Python3 day6面向对象
http://www.cnblogs.com/alex3714/articles/5188179.html
====================生活中====================
世界万物,皆可分类
世界万物,皆为对象
只要是对象:肯定属于某种品类
只要是对象:肯定有属性
================================================
大纲:
面向对象:特性
核心:Class:类
Object:对象
特性:继承:Inheritance :便于程序的扩展,同时减少大量冗余代码
封装:Encapsulation:隐藏实现细节
多态性:polymorphism :一个接口多个实现,在继承、派生时候
继承特性
类的 封装
构造函数:向类的方法传值使用。
格式:def __init__(self,变量名1,变量名2,变量名3....):
self.内部变量名a = 变量名1
self.内部变量名b = 变量名2
self.内部变量名c = 变量名3
析构函数:双下划线开始和结束,在被实例化的实例被删除的时候自动执行:如本例的__del__()
私有类变量:当只有在类内部才可以被调用,定义格式为双下滑线开始:如本例:self.__life_value = life_value
私有方法:当只有在类内部才可以被调用,定义格式为双下滑线开始:如本例:def __selffunc(self):
类的重构:对父类构造函数重构用于:子类中需加入新的参数时使用【本例子类Man中比父类多了money实例变量】
继承多类
经典类和新式儿类的区别:主要体现在多类的继承
类的继承搜索方式(策略):
一:广度优先:Python3默认(不区分经典类和新式类)
二:深度优先:Python 2里面经典类使用的继承方式,新式类使用广度优先继承方式
本图:广度优先:当子类D实例化时,优先在B或者C找 构造函数__init__(self,变量名...)找不到再想上A那里找。
类的继承应用:学校,学校成员(教师、学生)
一个学校类
学校成员类
教师子类、学生子类
目标:学校类功能:学校名字、地址、招聘教师,收学生
成员类功能:都有名字、年龄、性别等成员共同属性。
教师子类:继承成员类功能,增加教学功能、工资、所教课程种类、
学生子类:继承成员类功能,增加学习功能、班级、所学课程种类、
实例化多个学生和老师,学校进行招聘,和开课。学校里面的信息更新,和查看。
class School(object): '''学校共有属性''' def __init__(self,name,addr): self.name = name self.addr = addr self.students = [] self.staffs = [] def enroll(self,stu_obj): print('为学员:%s 办理注册手续'% stu_obj.name) self.students.append(stu_obj) def hire(self,staff_obj): print('hire teacher :%s'% staff_obj.name) self.staffs.append(staff_obj) class School_Member(object): '''成员共有属性''' def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def tell(self): pass class Teacher(School_Member): '''老师独有属性''' def __init__(self,name,age,sex,salary,coures): super(Teacher,self).__init__(name,age,sex) self.salary = salary self.coures = coures def tell(self): print(""" ==========info Teacher:%s ========= name:%s age:%d sex:%s salary:%d coures:%s """%(self.name,self.name,self.age,self.sex,self.salary,self.coures)) class Student(School_Member): '''学生独有属性''' def __init__(self,name,age,sex,stu_id,grade): super(Student,self).__init__(name,age,sex) self.stu_id = stu_id self.grade = grade def tell(self): print(""" ==========info Student:%s ========= name:%s age:%d sex:%s stu_id:%s grade:%s """%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade)) t1 = Teacher('zhangmingda',22,'Man',15000,'python') t2 = Teacher('zhangmingda2',23,'Man',18000,'Linux') s1 = Student('qjj',24,'Girl',10001,'python') s2 = Student('qjj2',25,'Girl',10002,'Linux') school1 = School('隆化职中','下洼子') school1.enroll(s1) school1.enroll(s2) school1.hire(t1) school1.hire(t2) school1.students[0].tell() school1.students[1].tell() school1.staffs[0].tell()
多态特性:一个接口多种实现
class Animal(object): def __init__(self,name): self.name = name def talk(self): '''如果直接用动物实例化一个名字,就断言为异常抛出,必须从动物子类实例一个动物''' raise NotImplementedError("Subclass must implement abstract method") class Make_dog(Animal): def talk(self): print('%s talking: 汪汪汪.....'% self.name) class Make_cat(Animal): def talk(self): print('%s talking: 喵喵喵.....' % self.name) def please_talk(obj): obj.talk() d1 = Make_dog('李亮') c1 = Make_cat('赵新新') please_talk(d1) please_talk(c1)
李亮 talking: 汪汪汪.....
赵新新 talking: 喵喵喵.....
在父类中实现一个接口多种实现(正常多态)
class Animal(object): def __init__(self,name): self.name = name def talk(self): '''如果直接用动物实例化一个名字,就断言为异常抛出,必须从动物子类实例一个动物''' raise NotImplementedError("Subclass must implement abstract method") @staticmethod def animal_talk(obj): '''在父类通过统一的接口,实现不同子类的统一功能调用,增强代码复用''' obj.talk() class Make_dog(Animal): def talk(self): print('%s talking: 汪汪汪.....'% self.name) class Make_cat(Animal): def talk(self): print('%s talking: 喵喵喵.....' % self.name) d1 = Make_dog('李亮') c1 = Make_cat('赵新新') Animal.animal_talk(d1) Animal.animal_talk(c1)
李亮 talking: 汪汪汪..... 赵新新 talking: 喵喵喵.....
posted on 2018-06-06 14:46 zhangmingda 阅读(142) 评论(0) 编辑 收藏 举报