继承,派生,组合
1 .继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
1 class People: 2 pass 3 class Animal: 4 pass 5 class Student(People,Animal):#people ,Animal 是父类(基类),Student是子类(派生类) 6 pass 7 print(Student.__bases__)#(<class '__main__.People'>, <class '__main__.Animal'>) 8 print(People.__bases__)#(<class 'object'>,) 9 print(Animal.__bases__)#(<class 'object'>,)
__base__是查看从左到右继承的子类,
__bases__是查看继承的父类
#在Python中,所有的类默认继承object,
#但凡是继承了object的子类,以及给子类的子类,都称为新式类
#Python3中都是新式类
#没有继承object的子类都是经典类,(在Python2中,没有继承object的类,以及它的类,都是经典类)
2,父类属性的引用
#Teacher是People的子类,继承是 什么 是 什么 的关系, Teacher是People的子类
class People: ##Teacher是People的子类,继承是 什么 是 什么的关系, Teacher是People的子类 def __init__(self,name,age,sex): self.name=name #是子类Teacher和Student共有的数据属性 self.age=age self.sex=sex def foo(self): #是子类Teacher和Student共有的函数属性 print('from father %s' %self.name) def walk(self): print('%s is walking'%self.name) class Teacher(People): school='oldboy' def __init__(self,name,age,sex,salary,leverl): People.__init__(self,name,age,sex) #引用父类的数据属性 self.salary=salary #加上自己特有的数据属性 self.level=leverl def teacher(self): print('%s is teache'%self.name) def foo(self): People.foo(self) #是加上了People的函数属性 print('from teacher') class Student(People): def __init__(self,name,age,sex,group): People.__init__(self,name,age,sex) self.group=group def study(self): print('%s is studyinng'%self.name) t=Teacher('egon',12,'male',1111,100) print(t.name,t.age,t.salary,t.level)#egon 12 1111 100 t.foo() #from father egon from teacher #实例化Teacher对象的他,引用了函数属性,同时引用了父类的函数属性
s=Student('alex',12,'mail','a')
print(s.__dict__['name']) print(s.__dict__['age'])
3.组合的使用
##Teacher 和Student的共有生日类,但不是继承关系,是 什么 有 什么 的关系,是Teacher有Data
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
1 #===============================老师,学生都有生日时间,用到组合 2 3 class Date: #Teacher 和Student的共有生日类,但不是继承关系,是 什么 有 什么 的关系,是Teacher有Data的关系 4 def __init__(self,year,mon,day): 5 self.year=year 6 self.mon=mon 7 self.day=day 8 def tell_birth(self): 9 print('出生于<%s>年 <%s>月 <%s>日'%(self.year,self.mon,self.day)) 10 11 class Teacher: 12 def __init__(self,name,age,year,mon,day): 13 self.name=name 14 self.age=age 15 self.birth=Date(year,mon,day) #birth=Date(year,mon,day) 就是在实例化对象,对象是birth,从类Data里开始实例化 16 17 def teach(self): 18 print('%s is teaching '%self.name) 19 20 class Student: 21 def __init__(self,name,age,year,mon,day): 22 self.name=name 23 self.age=age 24 self.birth=Date(year,mon,day) 25 def study(self): 26 print('%s is studying'%self.name) 27 28 t=Teacher('egon',12,1990,2,2) 29 print(t.name,t.age) #egon 12 30 print(t.birth)#<__main__.Date object at 0x000001FD59B903C8> 31 t.birth.tell_birth()# 调用了Data的函数属性 出生于<1990>年 <2>月 <2>日