python面向对象编程之组合
前面我们谈到了面向类和面向对象的继承,我们知道继承与“是”之间的关系。但是,类之间还有另一种关系,那就是组合。
先来看两个例子:
class Teacher:
def __init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.year=year
self.mon=mon
self.day=day
def walk(self):
print("%s is walking slowly"%self.name)
def teach(self):
print("%s is teaching"%self.name)
然后定义一个学生类。学生班级具有姓名、年龄、出生年月日、要学习的组名、走路和学习的技能等特点。
class Student:
def __init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.year=year
self.mon=mon
self.day=day
def walk(self):
print("%s is walking slowly"%self.name)
def study(self):
print("%s is studying"%self.name)
根据类的继承这个特性,可以把代码缩减一下。
定义一个人,然后让师生班继承人的特点和技能:
class People:
def __init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.year=year
self.mon=mon
self.day=day
def walk(self):
print("%s is walking"%self.name)
class Teacher(People):
def __init__(self,name,age,year,mon,day,course):
People.__init__(self,name,age,year,mon,day)
self.course=course
def teach(self):
print("%s is teaching"%self.name)
class Student(People):
def __init__(self,name,age,year,mon,day,group):
People.__init__(self,name,age,year,mon,day)
self.group=group
def study(self):
print("%s is studying"%self.name)
然后实例化教师和学生,得到教师和学生。
t1=Teacher("alex",28,1989,9,2,"python")
s1=Student("jack",22,1995,2,8,"group2")
现在很容易知道 t1 和 s1 的姓名、年龄、出生年份、月份和日期,但是一次打印出 t1 或 s1 的生日就不是那么容易了。这时候就需要使用字符串来连接它们。有没有更好的办法? ?
那就是组合。
继承是子类是父类的关系,而组合是一个类具有另一个类的关系。可以说每个人都有生日,但不能说人都是生日,所以使用了组合函数。你可以为出生的年月日定义另一个日期类,然后将老师或学生与这个日期的类结合起来,就可以轻松得到老师t1或学生s1的生日,不再需要字符串拼接太麻烦了。
来看下面的代码:
class Date:
def __init__(self,year,mon,day):
self.year=year
self.mon=mon
self.day=day
def birth_info(self):
print("The birth is %s-%s-%s"%(self.year,self.mon,self.day))
class People:
def __init__(self,name,age,year,mon,day):
self.name=name
self.age=age
self.birth=Date(year,mon,day)
def walk(self):
print("%s is walking"%self.name)
class Teacher(People):
def __init__(self,name,age,year,mon,day,course):
People.__init__(self,name,age,year,mon,day)
self.course=course
def teach(self):
print("%s is teaching"%self.name)
class Student(People):
def __init__(self,name,age,year,mon,day,group):
People.__init__(self,name,age,year,mon,day)
self.group=group
def study(self):
print("%s is studying"%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
alex is walking
alex is teaching
那要怎么能够知道他们的生日呢:
print(t1.birth)
输出为:
<__main__.Date object at 0x0000000002969550>
这个birth是子类Teacher从父类People继承的,父类People的birth和Date类结合,所以这个birth是一个对象。 Date类下有个birth_info技能,调用Date下的birth_info函数属性可以知道t1老师的生日。
t1.birth.birth_info()
得到的结果为:
The birth is 1989-9-2
同样,想知道示例学生 s1 的生日也使用相同的方法:
s1.birth.birth_info()
得到的结果为:
The birth is 1995-2-8
组合是在另一个类中使用一个类来将多个类组合在一起。组合功能还旨在减少代码重复。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python 3.8 有哪些新特性?12/12
- ♥ 如何在python中使用辅助函数12/09
- ♥ python3 os退出报错是什么原因?01/09
- ♥ python如何追加到文件中09/23
- ♥ Python中下划线的5种含义你都知道吗?01/06
- ♥ java开发平台eclipse可以配置python环境吗?10/02
内容反馈