知行编程网知行编程网  2022-11-24 21:30 知行编程网 隐藏边栏  2 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python面向对象编程之组合关系的相关知识,包括横组合关系,以及Python 面向对象这些编程知识,希望对大家有参考作用。


Python面向对象编程的组成关系


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

组合是在另一个类中使用一个类来将多个类组合在一起。组合功能还旨在减少代码重复。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享