Python面向对象编程之组合关系

面向对象编程的python组合
我们谈到了面向类和对象的继承,知道继承是什么“是”。然而,类和类之间还有另一种关系,即组合。
先看两个例子:
先定义两个类别,一个老师类别,有名字、年龄、出生年份、月份、日期、课程等特点,以及走路和教学技能。
classTeacher:
def__init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.year=year
self.mon=mon
self.day=day
defwalk(self):
print("%siswalkingslowly"%self.name)
defteach(self):
print("%sisteaching"%self.name)再定义一个学生类,学生类有名字、年龄、出生年份、月份和日期、学习组名等特点,以及走路和学习技能。
classStudent:
def__init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.year=year
self.mon=mon
self.day=day
defwalk(self):
print("%siswalkingslowly"%self.name)
defstudy(self):
print("%sisstudying"%self.name)根据类继承的特点,可以减少代码。
定义人类,然后让教师和学生继承人类的特征和技能:
classPeople:
def__init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.year=year
self.mon=mon
self.day=day
defwalk(self):
print("%siswalking"%self.name)
classTeacher(People):
def__init__(self,name,age,year,mon,day,course):
People.__init__(self,name,age,year,mon,day)
self.course=course
defteach(self):
print("%sisteaching"%self.name)
classStudent(People):
def__init__(self,name,age,year,mon,day,group):
People.__init__(self,name,age,year,mon,day)
self.group=group
defstudy(self):
print("%sisstudying"%self.name)然后以老师和学生为例,得到一个老师和一个学生。
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")现在很容易知道T1和S1的名字、年龄、出生年份、月份和日期,但一次打印T1或S1的生日并不容易。此时,您需要使用字符串进行拼接。有什么更好的方法吗??
相关推荐:Python视频教程
那就是组合。
继承是一种子类是一种父亲的关系,而组合是一种类有另一种类的关系。可以说每个人都有生日,而不是生日,所以有必要使用组合的功能 。你可以将出生日期和日期定义为另一个日期类别,然后将教师或学生与这个日期类别结合起来,你可以很容易地得到教师T1或学生S1的生日,不再像字符串拼接那么麻烦。
看下面的代码:
classDate:
def__init__(self,year,mon,day):
self.year=year
self.mon=mon
self.day=day
defbirth_info(self):
print("Thebirthis%s-%s-%s"%(self.year,self.mon,self.day))
classPeople:
def__init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.birth=Date(year,mon,day)
defwalk(self):
print("%siswalking"%self.name)
classTeacher(People):
def__init__(self,name,age,year,mon,day,course):
People.__init__(self,name,age,year,mon,day)
self.course=course
defteach(self):
print("%sisteaching"%self.name)
classStudent(People):
def__init__(self,name,age,year,mon,day,group):
People.__init__(self,name,age,year,mon,day)
self.group=group
defstudy(self):
print("%sisstudying"%self.name)
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")这样,老师T1或学生S1的姓名、年龄等特点以及步行、教学或学习技能都可以用同样的方法来调用。
print(t1.name) t1.walk() t1.teach()
输出为:
alex alexiswalking alexisteaching
怎样才能知道他们的生日?
print(t1.birth)
输出为:
<__main__.296950000000Dateobjectat00000000>
这个birth是从父类People继承下来的子类Teacher,而父类People的birth是和Date结合起来的,所以这个birth是一个对象。Date下面有一个birth_info技能,可以通过调用date下面的birth_info功能属性来了解老师t1的生日。
t1.birth.birth_info()
结果如下:
thebirthis1989-9-2
同样,学生S1的生日也用同样的方法知道实例:
s1.birth.birth_info()
结果如下:
thebirthis1995-2-8
组合是在一个类中使用另一个类,从而将几个类组合在一起。组合的功能也是减少重复代码。
相关推荐:
Python之初认识对象的继承
