最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python面向对象编程之组合关系

    正文概述    2020-04-28   270

    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的生日就不那么容易了,这时就需要用字符串进行拼接了,有没有什么更好的办法呢??

    相关推荐:《Python视频教程》

    那就是组合。

    继承是一个子类是一个父类的关系,而组合则是一个类有另一个类的关系。可以说每个人都有生日,而不能说人是生日,这样就要使用组合的功能 。可以把出生的年月和日另外再定义一个日期的类,然后用老师或者是学生与这个日期的类组合起来,就可以很容易得出老师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之初识对象的继承


    起源地下载网 » Python面向对象编程之组合关系

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元