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

组合就是一个类中使用到另一个类,从而把几个类拼到一起。组合的功能也是为了减少重复代码。

目录
相关文章
|
3月前
|
Java 程序员 C++
Python 面向对象详解!
本文详细介绍了Python中的面向对象编程(OOP),包括类、对象、继承、封装、多态和抽象等核心概念。通过具体示例,解释了如何使用类定义对象的属性和方法,以及如何通过继承实现代码重用。文章还探讨了封装和多态的重要性,并介绍了私有属性和抽象类的使用方法。最后,总结了OOP的四大支柱:封装、抽象、继承和多态,强调了这些概念在Python编程中的应用。适合Java程序员扩展Python编程知识。
86 2
|
1月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
5月前
|
Python
你真的会面向对象吗!解密Python“魔术方法”
你真的会面向对象吗!解密Python“魔术方法”
50 0
|
3月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
3月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
3月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
41 2
|
3月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
31 1
|
4月前
|
前端开发 Python
Python编程的面向对象有哪些(二)
Python编程的面向对象(二)—类的多态
30 7
|
4月前
|
IDE Java 开发工具
Python类与面向对象
Python类与面向对象
|
4月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
24 3