類的組合


一、什么是組合

  • 組合就是一個類的對象具備某一個屬性,該屬性的值是指向另外外一個類的對象

91-類的組合-tfboys.jpg?x-oss-process=style/watermark

二、為什么用組合

  • 組合是用來解決類與類之間代碼冗余的問題

  • 首先我們先寫一個簡單版的選課系統

class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


class OldboyStudent(OldboyPeople):
    def __init__(self, name, age, sex, stu_id):
        OldboyPeople.__init__(self, name, age, sex)
        self.stu_id = stu_id

    def choose_course(self):
        print('%s is choosing course' % self.name)


class OldboyTeacher(OldboyPeople):
    def __init__(self, name, age, sex, level):
        OldboyPeople.__init__(self, name, age, sex)
        self.level = level

    def score(self, stu, num):
        stu.score = num
        print('老師[%s]為學生[%s]打分[%s]' % (self.name, stu.name, num))


stu1 = OldboyStudent('tank', 19, 'male', 1)
tea1 = OldboyTeacher('nick', 18, 'male', 10)
stu1.choose_course()
tank is choosing course
tea1.score(stu1, 100)
老師[nick]為學生[tank]打分[100]
print(stu1.__dict__)
{'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1, 'score': 100}
  • 如上設計了一個選課系統,但是這個選課系統在未來一定是要修改、擴展的,因此我們需要修改上述的代碼

三、如何用組合

  • 需求:假如我們需要給學生增添課程屬性,但是又不是所有的老男孩學生一進學校就有課程屬性,課程屬性是學生來老男孩后選出來的,也就是說課程需要后期學生們添加進去的

  • 實現思路:如果我們直接在學生中添加課程屬性,那么學生剛被定義就需要添加課程屬性,這就不符合我們的要求,因此我們可以使用組合能讓學生未來添加課程屬性

91-類的組合-需求.jpg?x-oss-process=style/watermark

class Course:
    def __init__(self, name, period, price):
        self.name = name
        self.period = period
        self.price = price

    def tell_info(self):
        msg = """
        課程名:%s
        課程周期:%s
        課程價錢:%s
        """ % (self.name, self.period, self.price)
        print(msg)


class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


class OldboyStudent(OldboyPeople):
    def __init__(self, name, age, sex, stu_id):
        OldboyPeople.__init__(self, name, age, sex)
        self.stu_id = stu_id

    def choose_course(self):
        print('%s is choosing course' % self.name)


class OldboyTeacher(OldboyPeople):
    def __init__(self, name, age, sex, level):
        OldboyPeople.__init__(self, name, age, sex)
        self.level = level

    def score(self, stu, num):
        stu.score = num
        print('老師[%s]為學生[%s]打分[%s]' % (self.name, stu.name, num))
# 創造課程
python = Course('python全棧開發', '5mons', 3000)
python.tell_info()
        課程名:python全棧開發
        課程周期:5mons
        課程價錢:3000
linux = Course('linux運維', '5mons', 800)
linux.tell_info()
        課程名:linux運維
        課程周期:5mons
        課程價錢:800
# 創造學生與老師
stu1 = OldboyStudent('tank', 19, 'male', 1)
tea1 = OldboyTeacher('nick', 18, 'male', 10)
  • 組合
# 將學生、老師與課程對象關聯/組合
stu1.course = python
tea1.course = linux
stu1.course.tell_info()
        課程名:python全棧開發
        課程周期:5mons
        課程價錢:3000
tea1.course.tell_info()
        課程名:linux運維
        課程周期:5mons
        課程價錢:800
  • 組合可以理解成多個人去造一個機器人,有的人造頭、有的人造腳、有的人造手、有的人造軀干,大家都完工后,造軀干的人把頭、腳、手拼接到自己的軀干上,因此一個機器人便造出來了

91-類的組合-機器人.gif


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM