首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计模式 -- 常用设计模式

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。...Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  适用性: 你想使用一个已经存在的类,而它的接口不符合你的需求。...使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 # 应用场景:希望复用一些现存的类,但是接口又与复用环境要求不一致。  ...3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。...#        模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。

2.1K21

Python多继承、super与MRO算法

尽管这种方式非常直接,但缺点是如果父类名改变,这就意味着所有使用父类名的子类都需要改变,如果某个类的子类非常多,就可能会增加非常多的代码维护工作量。...在B类中并没有直接使用A类的名字,而是使用了super。如果A类的名字变化了,只需要修改B类的父类即可,并不需要修改B类内部的代码,这样将大大减少维护B类的工作量。...首先这个实例要求必须是B或B的子类的实例,所以A()以及其他不相关类的实例自然就排除在外,那么B()为什么不行呢?其实从语义上来说,B()没问题,但问题是这样将产生无限递归的后果。...那么什么是MRO算法呢? MRO算法: MRO算法是一个典型的递归操作,现在假设有如下两个函数: 1. mro:用于得到指定类的父类MRO列表。...现在拿前面的菱形继承关系为例说明如何得到MRO序列。这个序列的第一个元素就是C。

53610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python快速学习第七天

    下面是一个说明类是如何工作的例子: >>> a = A() >>> b = B() >>> a.hello() Hello, I'm A. >>> b.hello() Hello, I'm A....它是如何工作的 有的读者很想知道property函数是如何实现它的功能的,那么在这里解释一下,不感兴趣的读者可以跳过。...实现了其中任何一个方法的对象就叫描述符(descriptor)。描述符的特殊之处在于它们使如何被访问的。...它和迭代器可能是近几年来引入的最强大的两个特性。但是,生成器的概念则要更高级一些,需要花些功夫才能理解它使如何工作的以及它有什么用处。...本节会介绍如何使用生成器解决经典的变成问题。 9.8.1 生成器和回溯 生成器是逐渐产生结果的复杂递归算法的理想实现工具。

    2.3K50

    python基础教程:类的继承

    派生类的实例化会创建该类的一个新实例。方法引用将按以下方式解析:搜索相应的类属性,如果搜索的方法在派生类中找不到,就去基类中进行查找,如果基类本身也派生自其它类,则此规则将被递归地应用。...__class__为int或某个派生自int的类时为True。 issubclass()来检查类的继承关系:issubclass(bool, int)为True,因为bool是int的子类。...语句1 对于多数应用来说,在最简单的情况下,你可以认为搜索从父类所继承属性的操作是深度优先、从左至右的,当层次结构中存在重叠时不会在同一个类中搜索两次。...比如,我们要定义一个“助教”类,助教是帮助老师教学的高年级同学。他兼具老师和学生的特点,我们可以让这个类多重继承“老师类”和“学生类”。...任何形式为__name的标识符(至少带有两个前缀下划线,至多一个后缀下划线)的文本将被替换为_classname__name,其中classname为去除了前缀下划线的当前类名称。

    53910

    python开发第六篇--递归函数和面

    递归函数 递归函数的用法: - 递归函数:在一个函数里在调用这个函数本身。...- 其中类的数据属性是共享给所有对象的 - 而类的动态属性是绑定到所有对象的 2.创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性 在obj.name会先从...obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常 面向对象的三大特性:继承,多态,封装 1.继承 - 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类...- 当类是新式类时,多继承情况下,会按照广度优先方式查找。...- python2默认是经典类 - python3默认是新式类 经典类继承: class D: def bar(self): print 'D.bar' class C(D):

    32700

    python 多态和 super 用法

    python 中的多态实现非常简单,只要是在子类中实现和父类同名的方法,便能实现多态,如果想在子类中调用父类的方法,有多种方法,但是当涉及菱形继承等问题是,super 就成为了比较好的解决方案。...普通继承对于比较简单的继承关系,通常在子类中有两种方法来执行父类的方法,示例如下。...需要注意的是,两种方法都要传入 self,但是在子类中调用父类的 super 中传入的 self是子类对象。菱形继承当有多重继承,特别是菱形继承时,这两种方法就有区别了,示例如下。...为了弄清它的原理,我们需要花点时间解释下 python 是如何实现继承的。对于你定义的每一个类,python 会计算出一个所谓的方法解析顺序(MRO)列表。...由于 super 递归调用的会继续搜索的特性,可能会出现一些意向不到的效果,比如下面这个例子:class A(object):def spam(self): print('A.spam')

    12710

    python类中super()和__init__()的区别

    目录[-] 单继承时super()和init()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create...__init__() TypeError: must be type, not classobj super不是父类,而是继承顺序的下一个类 在多重继承时会涉及继承顺序,super()相当于返回继承顺序的下一个类..._init_(), super(childA, self)返回当前类的继承顺序中childA后的一个类childB;然后再执行childB()._init()_,这样顺序执行下去。..., 如果是本身就会依次继承下一个类; 如果是继承链里之前的类便会无限递归下去; 如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类; 比如将childA()中的super改为:super(childC..., self).init(),程序就会无限递归下去。

    97060

    Python中的函数式编程与设计模式结合:提高代码可维护性与可扩展性的探索

    组合模式组合模式是一种结构设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次结构。在Python中,我们可以使用函数和递归来实现组合模式。...,其中Component是组合中的基类,Leaf表示叶子节点,Composite表示组合节点。...通过递归地调用display()方法,我们可以显示整个组合对象的结构。7. 适配器模式适配器模式是一种结构设计模式,它允许将接口不兼容的类进行合作。...()在上面的示例中,AbstractClass是抽象类,其中定义了模板方法template_method()和一些基本操作。...ConcreteClass是具体类,它实现了抽象类中的抽象方法required_operation1()。通过调用模板方法,我们可以执行一系列的操作,其中一些操作由子类实现。

    14210

    Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系1.单继承时super()和__init__()实现的功能是类似的class Base(object): def __init__(self...而是继承顺序的下一个类在多重继承时会涉及继承顺序,super()相当于返回继承顺序的下一个类,而不是父类,类似于这样的功能:def super(class_name, self): mro = self...,因此执行顺序是A —> B—>—>Base  执行过程相当于:初始化childC()时,先会去调用childA的构造方法中的 super(childA, self)....__init__(), super(childA, self)返回当前类的继承顺序中childA后的一个类childB;然后再执行childB().__init()__,这样顺序执行下去。  ...,如果是本身就会依次继承下一个类;如果是继承链里之前的类便会无限递归下去;如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类;比如将childA()中的super改为:super(childC

    72710

    python 魔术方法(一) 自定义容器类与类属性控制

    特殊方法是 Python 解释器自动调用的,因此你无需自己处理,但是,需要注意的是,这些特殊方法是如此强大,同时也存在着很多的陷阱,在使用中必须处处小心谨慎。 3. 自定义容器类 3.1....获取元素 — __getitem__ __getitem__(self, key) 对于容器来说,获取元素是最重要的操作,魔术方法 __getitem__就完成了这个工作,每当对对象通过[]操作符获取元素时...获取容量 — __len__ __len__(self) 对于容器类,一个很重要的操作是获取容器中元素的数量 — len() 我们曾经介绍过 Python 对象的内存结构: python 的内存管理与垃圾收集...元素的更改与删除 — __setitem__ 与 __delitem__ __setitem__(self, key, value) __delitem__(self, key) 上面我们实现的容器类是不可变的...__missing__ __missing__(self, key) 如果你的类是一个继承自 dict 的字典类,并且你没有实现自己的 __getitem__ 方法,那么当默认的 __getitem__

    62720

    Python基础教程

    封装(Encapsulation):对外部世界隐藏对象的工作细节。 继承(Inheritance):以通用的类为基础建立专门的类对象。 7.1.1 多态 术语多态的意思是“有多种形式”。...真正重要的是如何让对象按照你所希望的方式工作,不管它是不是真正的类型(或者类)。 7.1.2 封装 封装是指向程序中的其他部分隐藏对象的具体实现细节的原则。...但是封装并不等同于多态,多态可以让用户对于不知道什么是类(对象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。...7.1.3 继承 略 7.2 类和类型 7.2.1 类到底是什么 类是一种对象,所有的对象都属于某一个类,称为类的实例(instance)。...7.2.6 检查继承 如果想要查看一个类是否是另一个的子类,可以使用内建的issubclass函数。

    76720

    Python干货——单例模式

    人总是在反省中进步的! 大家好!我是你们的老朋友Java学术趴。今天给大家分享一下如何在Python中创建一个单例模式。...其中一个是用来访问私有化属性的方法,一个是用来修改私有化属性的方法。那么,这样对于调用者来说 感觉就是在调用一个方法,并不是访问属性。...继承自object的新式类才有new这个魔术方法注意事项:new是在一个对象实例化的时候所调用的第一个方法new至少必须存在一个参数cls(可以自定义),代表的要实例化的类,此参数在实例化的时候由Python...在new方法中,不能调用自己的new方法,即:return cls._ new_(cls),否则会报错(超过最大递归深度)new方法是一个静态方法使用new方法的前提是:这个类必须继承了超类object...,因为存在默认继承,所以可以省略不写即使我们在类中没有写new方法,在创建类实例对象的时候Python也会默认自动调用,如果写了就调用我们自己写的new方法# __new__方法和单例模式class Animal

    57950

    Python升级之路( Lv7 ) 面向对象深入

    主要讲述了继承和多态: 继承某个父类, 可以实现并重写父类方法, 并且所有类都继承父类Object, 因此可以使用很多Object提供的特殊方法和特殊属性; 而多态指的的是不同子对象在调用父类方法时会有不同体现...而面向对象编程具有三大特性:继承、封装(隐藏)、多态 具体含义如下 继承: 继承可以让子类具有父类的特性,提高了代码的重用性 从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新的功能,或者改进已有的算法...,李四休息是玩游戏,程序员休息是“敲几行代码” 继承 继承是面向对象编程的三大特征之一....深拷贝: 使用 copy 模块的 deepcopy 函数,递归拷贝对象中包含的子对象 深拷贝:拷贝时,拷贝源对象,也递归拷贝对象中包含的子对象 如图所示: 实操代码 print("====...工厂类使用单例模式,也就是说只能有一个工厂对象 (2) 工厂类中可以生产各种品牌的电脑:联想、华硕、神舟 (3) 各种品牌的电脑使用继承实现: (4) 父类是Computer类,定义了calculate

    47010

    Python中实现简单的插件框架

    实现基础插件类 我们先构建一个基础插件类:plugin_collection.py class Plugin: """ 该基类每个插件都需要继承,插件需要实现基类定义的方法"""...PluginCollection类基础组件实现如下:plugins_collection.py class PluginCollection: """ 该类会通过传入的package查找继承了...Plugin类的插件类 """ def __init__(self, plugin_package): self.plugin_package = plugin_package...PluginCollection类里的walk_package方法,该方法按如下步骤操作: 1、操作package里所有的模块 2、针对找到的模块,检查是否是Plugin的子类,非Plugin自身。...该检查的好处是你可以放入其他Python模块,也并不影响插件的使用 3、检查当前package下的子目录,递归查找插件 def walk_package(self, package):

    2.4K10

    iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法

    二、棋盘中独立棋格的设计     我们知道,五子棋游戏的棋盘是由横纵交叉的两组平行线组成,每一个横纵线的交点即是棋盘上可以落子的点。... addSubview:view];     } @end 三、游戏棋盘的设计     创建一个继承于UIView的类,作为五子棋游戏的棋盘,命名为GameView实现如下: GameView.h #import...,这里有一点需要主要,在4个方向进行递归查找时,理论上每个方向只需要单面递归即可,但是代码中采用了双面递归在进行累加的方式,这样的设计可以遍历更少的棋子判定出胜负情况。...四、整合通讯与游戏逻辑    创建一个继承于UIViewController的类作为游戏视图控制器,实现如下: GameViewController.m #import "GameViewController.h...附录:游戏的源码已经放在git上,时间比较仓促,只用了一下午来写,其中还有许多细节与bug没有进行调整,有需要的可以作为参考: git地址:https://github.com/ZYHshao/BlueGame

    80330

    python基础教程:内置函数(二)

    有关支持的编码列表,请参阅 codecs 模块。 errors 是一个可选的字符串参数,用于指定如何处理编码和解码错误 – 这不能在二进制模式下使用。...在具有单继承的类层次结构中,super可用于引用父类而不显式命名它们,从而使代码更易于维护。这种用法与其他编程语言中super的使用密切相关。 第二个用例是在动态执行环境中支持协作多重继承。...此用例是Python独有的,在静态编译语言或仅支持单继承的语言中找不到。这使得实现“菱形图”成为可能,其中多个基类实现相同的方法。...如果对象是类型或类对象,则列表包含它们的属性名称,并且递归查找所有基类的属性。 否则,列表包含对象的属性名称,它的类属性名称,并且递归查找它的类的所有基类的属性。 返回的列表按字母表排序。...如果 object 不是给定类型的对象,函数始终返回 false。如果 classinfo 是对象类型(或多个递归元组)的元组,如果 object 是其中的任何一个的实例则返回 true。

    1.3K20

    Python封装

    """ 斐波那契 python中的递归函数, time模块中的sleep(单位是秒s) 1- 用现有的while循环来实现 2- 递归实现,必须有一个停止的条件来调用自己 """...*属性**是需要单独开辟内存的,防止一损俱损 2- 但是类的自定义方法是唯一的只有一份内存, 是通过self判断不同的调用对象是谁 """ p4 = Person("张三", 18, 1605477...id相同 print(id(p5.print_info())) """ 单继承,class B(A) 括号里面的是相对B来说的B的父类,集成了A的属性和方法 1- python中类的属性是直接写在...() """ 多继承class D(C, A),如果多个父类C,A中都含有相同的方法和属性print_num那么子类D继承的是就是C的,注意继承的先后顺序 1- 父类中的属性和方法如果相同的话...,会继承第一个父类的属性和方法,按照集成的顺序走init构造方法 2- D类中重写父类的方法,如果自己d类中重写了init方法,那么就不会继承任何的父类属性从init方法中 3- 换句话,子类重写了父类的方法

    1.5K20
    领券