python:oop范式

来源:互联网 发布:html用什么软件编写 编辑:程序博客网 时间:2024/05/23 16:03

oop来说,必然逃不过两个概念:继承与组合。

什么时候使用继承,使用时候组合?

  • 在写简单的代码的时候,谁都清楚该怎么区分。
  • 但是,一旦业务逻辑复杂,就很难确定当前情况该使用继承还是组合了。相信使用过任意oop语言做过实际项目的人都对此深有体会。
  • 就我个人而言,也是经常在业务代码中,很难去判断当前情况该使用哪一种方式。之前我的一位老师说过,代码没有对错,只有好坏。所以,该如何使用,有时候真的只能用一句:“看具体使用场景”来回答了。

  • 这里给出《Learning Python》中的一个使用继承的范式,及一个使用组合的范式。

  • 首先是继承的范式:

#!/usr/bin/env python3# -*- coding: utf-8 -*-# @name   : inherit.py# @author : cat# @date   : 2017/6/25.from tools import AttrDisplay# 继承关系class Employee(AttrDisplay):    def __init__(self, name, salary=0):        self.name = name        self.salary = salary    def giveRaise(self, percent):        self.salary = self.salary + self.salary * percent    def work(self):        return "{} does stuff.".format(self.name)class Chef(Employee):    def __init__(self, name, ):        Employee.__init__(self, name, 5000)    def work(self):        return "{} make food.".format(self.name)class Server(Employee):    def __init__(self, name):        Employee.__init__(self, name=name, salary=4000)    def work(self):        return "{} interfaces with customer.".format(self.name)class PizzaRobot(Chef):    def __init__(self, name):        Chef.__init__(self, name)    def work(self):        return "{} make pizza.".format(self.name)if __name__ == '__main__':    e = Employee('tom ding')    c = Chef('victor')    s = Server('Ann')    r = PizzaRobot('stone')    print(e, c, s, r, sep="\n")    pass
  • 其次是一个组合的范式:
#!/usr/bin/env python3# -*- coding: utf-8 -*-# @name   : combination.py# @author : cat# @date   : 2017/6/25.# 组合关系from tools import AttrDisplayfrom inherit import Server, PizzaRobotclass Customer(AttrDisplay):    def __init__(self, name):        self.name = name    def order(self, server):        print(self.name, "order from", server)    def pay(self, server):        print(self.name, "pay item to", server)class Oven(AttrDisplay):    def bake(self):        return "oven bake."class PizzaShop(AttrDisplay):    def __init__(self):        self.chep = PizzaRobot('bob')        self.server = Server('pat')        self.oven = Oven()    def order(self, name):        customer = Customer(name)        customer.order(self.server)        self.server.work()        self.chep.work()        self.oven.bake()        customer.pay(self.server)if __name__ == '__main__':    shop = PizzaShop()    shop.order("tom ding")    print(".....")    shop.order("pythonCat")

使用的一个工具类:

#!/usr/bin/env python3# -*- coding: utf-8 -*-# @name   : tools.py# @author : cat# @date   : 2017/6/25.class AttrDisplay:    def __gatherAttrs(self):        return ["{}={}".format(key, getattr(self, key))                for key in self.__dict__.keys()]    def __repr__(self):        return "<{}:{}>" \            .format(self.__class__.__name__,                    ",".join(self.__gatherAttrs()))    def __str__(self):        return AttrDisplay.__repr__(self)if __name__ == '__main__':    class P(AttrDisplay):        def __init__(self, name, age):            self.name = name            self.age = age        def func(self):            return "func ...."    c = P('tom ding', 32)    print(c)

上述代码清晰易懂:

  • 在继承的范式中,给出的是一个员工的继承关系。厨师,服务员都是员工的子类,披萨机器人是厨师的子类。
  • 在组合的范式中,披萨店是一个组合类,也是控制器。披萨店里面有烤箱,服务员,厨师,和顾客。其中,除了顾客之外,其他的店里必须存在的,而顾客是流动的,不固定的。

以上的关于oop的继承与组合的范式只是辅助与警醒如何去正确的使用继承与组合。
在实际项目中,复杂的业务逻辑里面,可能会掺杂各种耦合,导致继承不像继承,组合不像组合。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 贴壁纸阴角不力怎么办 自贴墙纸有气泡怎么办 壁纸贴的有起泡怎么办 pos机连接主机失败怎么办 无线pos机连接主机失败怎么办 水墨晕染模板用不了怎么办 申请入驻饿了么失败怎么办 天猫流量大淘宝怎么办 拼多多商家不退款怎么办 苹果手机开流量显示e怎么办 苹果手机有服务流量打不开怎么办 苹果七plus流量打不开怎么办 苹果手机突然打不开流量怎么办 天猫商家迟迟不发货怎么办 苹果7开不开机了怎么办 苹果机黑屏了开不起来怎么办 美团收银机连不上网怎么办 6s换电池后黑屏怎么办 苹果上的软件打不开也删不掉怎么办 苹果手机打开软件打不开怎么办 苹果电脑下载的软件打不开怎么办 苹果手机下载的软件都打不开怎么办 苹7果屏幕黑屏怎么办 苹果6s手机打不开怎么办 苹果ipad密码输入打不开怎么办 苹果平板黑屏了打不开怎么办 苹果6sp电影商城打不开怎么办 苹果6应用商城打不开怎么办 游戏下载好了安装不上怎么办 苹果5s应用商店不见了怎么办 id被停用手机白板打不开怎么办 苹果6s下载不了软件怎么办 苹果下载的软件打不开怎么办 苹果6s下不了app怎么办 苹果手机因为闪退打不开了怎么办 天猫方糖坏了怎么办 天猫魔盒的遥控器坏了怎么办 天猫盒子没声音怎么办 天猫魔盒播放声音很低怎么办 天猫魔盒3a卡顿怎么办 天猫网络机顶盒打不开了怎么办