zoukankan      html  css  js  c++  java
  • 🍖类的组合

    一.什么是类的组合

    组合就是, 一个类或一个类的对象中的某一个属性, 这个属性是另一个类的对象

    二.为什么使用组合

    用来解决类与类之间代码冗余的问题 (代码重用性)

    三.组合与继承的区别

    组合和继承都是有效的利用已有类的资源的重要方式, 但二者的概念和使用场景不同

    1.继承方式

    • 继承是一种 "是" (属于) 的关系, 诗人是人, 歌星是人, 当类之间有很多相同的之处,应该使用继承
    # 人类
    class Person:
        def __init__(self,name,age,sex):
            self.name =name
            self.age = age
            self.sex = sex
    
        def run(self):
            print(f"{self.name}跑起来")
    
    # 歌星类
    class Start(Person):
        def sing(self):
            print("唱歌")
    
    # 诗人类
    class Poet(Person):
        def write(self):
            print("写诗")
    
    S1 = Start("毛不易",25,"man")
    P1 = Poet("李白",10000,"man")
    
    S1.run()  # 毛不易跑起来
    P1.run()  # 李白跑起来
    

    2.组合方式

    • 组合是一种 "有" 的关系, 例:我有工作、有房子, 银行卡有转账、存储功能, 我可以拥有一张银行卡作为我的组件
    • 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
    下面这个例子就是"bank"类的对象作为一个组件放置在其他类或其他类的对象中,成为他们的属性
    示例讲解 : 餐厅里有个员工和老板, 老板给员工发工资, 员工办了张卡来收工资
    class People:
        school = "蟹堡王餐厅"
    
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    class Staff(People):  # 员工
        bank_card = {}    # 银行卡 {xx银行:余额}
    
        def sell(self):
            print(f"{self.name}正在卖蟹堡")
    
        def apply_catd(self,card_name):  # 办银行卡
            self.bank_card[card_name] = 0
            print(f"{self.name}办了一张{card_name}卡")
    
    class Boss(People):   # 老板
        def payoff(self,obj,obj_card_name,money):
            obj.bank_card.update({obj_card_name:money})
            print(f"老板{self.name}给{obj.name}的{obj_card_name}卡打了{money}元工资")
    
    class Bank:  # 出卡的类
        def __init__(self,bank_name):
            self.bank_name = bank_name
    
    # 实例出银行卡
    card1 = Bank("蟹堡银行")
    
    # 实例出一个员工
    S1 = Staff("派大星",35,"man")
    
    # 实例老板
    B1 = Boss("姗姗",30,"woman")
    
    # 员工办卡
    S1.apply_catd(card1.bank_name)
    
    # 老板给员工发工资
    B1.payoff(S1,"蟹堡银行",300)
    
    # 查看员工的工资卡字典
    print(S1.bank_card)
    '''执行输出
    派大星办了一张蟹堡银行卡
    老板姗姗给派大星的蟹堡银行卡打了300元工资
    {'蟹堡银行': 300}
    '''
    
  • 相关阅读:
    网络唤醒的尝试
    远程桌面连接修改与远程连接的痕迹清理+User Profile Service服务未能登录,无法加载用户配置文件
    web与flash结合:不出现提示,直接关闭窗口(javascript)+直接关闭,不提示
    net framework 2.0,3.0与3.5三个版本之间关系
    c#连接access2003操作必须使用一个可更新的查询解决方法
    分析网络故障慢慢来!一定要抓到真凶(有关arp)
    GridView遭遇数据类型"是/否",获取gridview的一个单元格的值并更改,附带更新GridView用法
    查询和删除表中重复数据sql语句
    hibernate学习笔记
    不要在一门技术上吊死
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14186730.html
Copyright © 2011-2022 走看看