面向对象的三大特性
1 继承
2 封装
3 多态
绑定方法与非绑定方法
异常处理
上次复习:
定义类的时候 建议首字母大写
名称空间以字典形式显示
__init__ 这个函数不能有返回值
内部可以有一些其他逻辑,比如判断
举例:
绑定方法在调用的时候 谁调用绑定方法就会把谁传进去
1 继承
2 封装
3 多态
继承 封装 多态 会体现面向对象的可扩展性
1 继承
什么是继承
是一种新建类的方式,新建的类是子类,子类会遗传父类的属性
作用:减少代码的冗余
在Python当中,子类可以继承1个或多个父类
python支持多继承
子类称之为派生类 父类可以被称为基类 派生类
在Python2当中类分为两种 1 经典类 2 新式类
继承的写法:
1 #定义2个父类 2 class Parent1: 3 pass 4 5 class Parent2: 6 pass 7 8 #定义2个子类 9 #子类的单继承 10 class sub1(Parent1): 11 pass 12 #子类的多继承 13 class sub2(Parent1,Parent2): 14 pass 15 #查看子类继承了哪些父类__bases__ 16 # print(sub1.__bases__) #(<class ‘__main__.Parent1‘>,) 17 # print(sub2.__bases__) #(<class ‘__main__.Parent1‘>, <class ‘__main__.Parent2‘>) 18 # 19 # 20 # print(Parent1.__base__)#<class ‘object‘>
在Python2当中类分为两种
1 经典类 2 新式类:
1 经典类 指的是没有继承object类的类,以及该类的子类
2 新式类 指的是继承object类的类,以及该类的子类
在Python3当中,统一为新式类,默认都继承object
先抽象再继承
1一系列对象得到一种类
2总结类之间相似部分就可以得到父类
3 子类是父类的关系
减少代码的冗余
示例代码:
1 #原来的书写方式 这样写有代码冗余 2 3 #1 student类 4 class Student: 5 school=‘oldboyedu‘ 6 def __init__(self,name,age,sex): 7 self.Name=name 8 self.Age=age 9 self.Sex=sex 10 11 def learn(self): 12 print(‘%s is learning‘%self.Name) 13 14 15 class Teacher: 16 school = ‘oldboyedu‘ 17 18 def __init__(self, name, age, sex): 19 self.Name = name 20 self.Age = age 21 self.Sex = sex 22 23 def teach(self): 24 print(‘%s is teach python‘%self.Name) 25 26 #通过继承的方式减少冗余 27 28 class OldboyPerson: 29 school=‘oldboyedu‘ 30 def __init__(self,name,age,sex): 31 self.Name=name 32 self.Age=age 33 self.Sex=sex 34 def tell_info(self): 35 print(‘info:%s-%s-%s‘%(self.Name,self.Age,self.Sex)) 36 class Student(OldboyPerson): 37 def learn(self): 38 print(‘%s is learning‘%self.Name) 39 40 def tell_info(self): 41 print(‘infostuent:%s-%s-%s‘%(self.Name,self.Age,self.Sex)) 42 class Teacher(OldboyPerson): 43 def teach(self): 44 print(‘%s is teach python‘%self.Name) 45 def tell_info(self): 46 print(‘infoteacher:%s-%s-%s‘%(self.Name,self.Age,self.Sex)) 47 48 49 #派生的概念 参照对象的属性查找顺序: 50 #对象的名称空间-->对象所在类的数据属性函数属性-->如果没有的话查找继承的父类的数据属性和函数属性 51 52 53 stu1=Student(‘nod‘,‘25‘,‘M‘) 54 tea1=Teacher(‘luna‘,‘26‘,‘F‘) 55 stu1.tell_info() 56 tea1.tell_info()
如果对象的类有继承的话,对象属性的查找顺序是先从对象本身查找,再查找对象的类,
最后再查找对象继承的类
03 子类重用父类的功能,方法
先来一段示例:
1 class Foo: 2 def f1(self): 3 print(‘foo.f1‘) 4 def f2(self): 5 print(‘foo.f2‘) 6 self.f1() #obj.f1() 7 8 class Bar(Foo): 9 def f1(self): 10 print(‘bar.f1‘) 11 12 obj=Bar() 13 14 obj.f2() 15 #以上代码的执行效果 16 #foo.f2 17 #bar.f1
说明:找的顺序始终跟之前一样
如果子类派生出新的属性是以自己的为准
子类派生出新方法要重用父类的功能时 不依赖于继承 重用父类的方法
OldboyPeople.tellinfo(self)
示例代码
1 #子类重用父类的方法示例 2 class OldboyPerson: 3 school=‘oldboyedu‘ 4 def __init__(self,name,age,sex): 5 self.Name=name 6 self.Age=age 7 self.Sex=sex 8 def tellinfo(self): #此处的self是1个object 有名称空间 9 print(‘info is %s-%s-%s‘%(self.Name,self.Age,self.Sex)) 10 class Teacher(OldboyPerson): 11 def teach(self): 12 print(‘%s is teach‘%self.Name) 13 #需要重用父类的方法 父类当中本身有tellinfo方法 但是子类当中的tellinfo新增了部分功能 14 def tellinfo(self): 15 print(‘Teacher info‘) 16 OldboyPerson.tellinfo(self) 17 class Student(OldboyPerson): 18 def learn(self): 19 print(‘%s is learning‘%self.Name) 20 def tellinfo(self): 21 print(‘student info‘) 22 OldboyPerson.tellinfo(self) #重用父类的方法 23 24 stu1=Student(‘nod‘,‘25‘,‘M‘) 25 stu1.tellinfo() 26 tea1=Teacher(‘luna‘,‘26‘,‘F‘) 27 tea1.tellinfo() 28 29 30 #子类重用父类的属性 自己还要新增部分属性示例 31 #不依赖于继承 重用父类的方法 32 33 34 class OldboyPerson: 35 school=‘oldboyedu‘ 36 def __init__(self,name,age,sex): 37 self.Name=name 38 self.Age=age 39 self.Sex=sex 40 def tellinfo(self): 41 print(‘info is %s-%s-%s‘%(self.Name,self.Age,self.Sex)) 42 43 class Student(OldboyPerson): 44 def __init__(self,name,age,sex,course,id): 45 OldboyPerson.__init__(self,name,age,sex) 46 self.Course=course 47 self.Id=id 48 def tellinfo(self): 49 print(‘student info ‘,end=‘‘) 50 OldboyPerson.tellinfo(self) #不依赖于继承 重用父类的方法 51 print(‘%s-%s‘%(self.Course,self.Id)) 52 print(self.__dict__) 53 54 stu2=Student(‘nod‘,‘25‘,‘F‘,‘linux‘,‘51‘) 55 stu2.tellinfo()
原文地址:https://www.cnblogs.com/nodchen/p/8997771.html