精华内容
下载资源
问答
  • Python在2.2之后就有使用一种叫做new style class,即新式类 首先需要说明的是,在python3.X(包括3.0)中,新建类都...新式类的定义也就是等同于经典类的区别:  1. 第一个区别是在声明时有区别,得到的结果也有不同

    Python在2.2之后就有使用一种叫做new style class,即新式类

    首先需要说明的是,在python3.X(包括3.0)中,新建类都自动生成为新式类,新式类成为默认值。

    (如果不是为了兼容性考虑,建议使用最新版本的python解释环境,毕竟发展是朝向更加标准、清晰走的。)

    新式类的定义也就是等同于与经典类的区别: 

    1. 第一个区别是在声明时有区别,得到的结果也有不同

    # 在python2.7解释环境中
    class A: pass    #经典类
    class B(object): pass	#在2.X环境中,若声明为新式类需要直接继承object类
    
    a = A()
    b = B()
    
    print a
    print type(a)
    print type(a.__class__)
    
    print b
    print type(b)
    print type(b.__class__)
    

    结果:

    <__main__.A instance at 0x000001B34B1707B8>
    <type 'instance'>
    __main__.A
    
    <__main__.B object at 0x000001B34B170278>
    <class '__main__.B'>
    <class '__main__.B'>

    而在3.x环境中直接进行定义即为新式类:

    # 在python 3.6解释环境中
    class C:pass # 新式类为默认值,无需显式继承自object,等同于在python2.X中的语句: class C(object): pass
    
    c = C()
    print(c)
    print(c.__class__)
    print(type(c))
    结果:

    <__main__.C object at 0x000001B34B16B400>
    <class '__main__.C'>
    <class '__main__.C'>

    2. 新式类的继承顺序较经典类继承顺序发生改变。

    经典类的多继承时,属性搜索顺序为:先深入继承树的左侧,再返回开始找右侧,也就是深度优先;

    新式类的多继承时,属性搜索顺序为:先找最近超类(父类)从左至右,再深度搜索更高超类,也就是所谓的广度优先。
    例:

    # ptyhon 3.6解释环境中,新式类广度优先
    class A:    x = 1
    
    class B(A):    pass
    
    class C(A):    x = 3
    
    class D(B,C):    pass
    
    d = D()
    print(d.x)
    结果:

    >>> 3
    属性的搜索过程:d --> D --> B --> C --> A,

    而如果在经典类搜索模式中以上搜索过程就变为:d --> D --> B --> A --> C

    # ptyhon 2.7解释环境中,新式类广度优先
    class A:    x = 1
    
    class B(A):    pass
    
    class C(A):    x = 3
    
    class D(B,C):    pass
    
    d = D()
    print(d.x)

    结果:

    >>> 1
    在经典类中,有一个概念就是钻石搜索模式,所谓的钻石搜索模式就是经典类搜索模式,即上面提到的深度优先原则搜索模式,在看《python学习手册(第四版)》时有一点混乱,所以这里拿出来说一下。


    3. 支持__slots__实例属性列表

    __slots__中加入的属性是该类生成的实例能够访问和改变的唯一属性(包括从超类__slots__中获得的属性)

    # python3.6解释环境,windows系统下
    class D:
        __slots__ = ['name','age']
        
    d = D()
    d.name = 'Dogg Snop'
    print(d.name)
    
    d.location = 'Tianjing'
    print(d.location)
    结果:

    Dogg Snop
    Traceback (most recent call last):
      File "<pyshell#108>", line 1, in <module>
        d.location = 'Tianjing'
    AttributeError: 'D' object has no attribute 'location'
    如果属性没有在类的命名空间中使用__slots__指出,那么实例就无法再外部进行赋值使用(即添加新属性)
    但是可以使用类名直接进行类属性添加:

    D.location = "Tianjing"
    print(d.location)
    结果:

    Tianjing
    这个也就是在实例中去掉了__dict__属性,才出现无法再实例中无法添加新属性,但是类名直接添加属性;如果想要让用户添加属性,但是又不想被滥用,则可以在__slots__中添加__dict__属性: __slots__ = [……, '__dict__'],这样用户就无法直接使用d.attrname = attrvalue,而必须使用d.__slots__.__dict__[attrname] = attrvalue,防止意外添加属性导致的属性错误和泛滥。

    4. 在新式类中,添加了__getattribute__()方法

    # Python3.X解释器中
    class A:
        def __getattribute__(self, *args, **kwargs):
            print "A.__getattribute__"  
    a = A()
    a.test
    结果:

    >>> A.__getattribute__


    # Python 2.X解释器中 
    class B:    
        def __getattribute__(self, *args, **kwargs):    
            print "B.__getattribute__"
    b = B()
    b.test

    结果:

    Traceback (most recent call last):
      File "<pyshell#109>", line 1, in <module>
        b.test
    AttributeError: B instance has no attribute 'test'

    总结:新式类和经典类是在Python3.0出现以后产生的一种类的新形势,而在2.X版本中添加新式类的定义形式,主要目的还是为了达到兼容性;如果是最初学习的小白,建议直接使用3.X版本的解释器,毕竟越新越规范。




    
    
    展开全文
  • 外观模式: 把真实实现的模块(即,现有系统,往往比较复杂、功能强大,但新形势下不需要全部的功能)中有用的部分进行一定的分析、组合、添加,形成一套简洁实用的接口,供多个客户同时使用; 代理模式

    代理模式、适配器、外观模式之间的差别

    这三者模式的共性之处: 客户只关心接口,不关心具体的 (真实的) 实现,符合面向对象设计原则 “面向接口编程,不要面向实现编程”。

    适配器模式: 把真实的实现模块(一个或者多个对象,或者就是函数库)中,一个一个方法(或者函数),依次匹配到客户需要的格式,与客户代码一起工作;

    外观模式: 把真实实现的模块(即,现有系统,往往比较复杂、功能强大,但新形势下不需要全部的功能)中有用的部分进行一定的分析、组合、添加,形成一套简洁实用的接口,供多个客户同时使用;

    代理模式:  把客户与真实的对象(比如一个服务器对象)之间,通过代理进行隔离。客户只要访问代理,由代理把客户请求转发给真实的对象。代理模式 是代理一个对象。供多个客户使用。

     

    ------------------------------------------------交流、学习、进步!-----------------------------------------------------

    欢迎加入《面向对象分析与设计》课程学习!

    展开全文
  • 设计模式之策略模式

    2020-06-04 21:45:17
    策略模式 什么是策略 一般是指: 可以实现目标的方案集合。 根据形势发展而制定的行动方针和斗争方法。 有斗争艺术,能注意方式方法。 “策略”就是为了实现某一个目标,首先预先根据可能出现的问题制定的若干...

    策略模式

    什么是策略

    一般是指:

    1. 可以实现目标的方案集合。
    2. 根据形势发展而制定的行动方针和斗争方法。
    3. 有斗争艺术,能注意方式方法。

    “策略”就是为了实现某一个目标,首先预先根据可能出现的问题制定的若干对应的方案,并且,在实现目标的过程中,根据形势的发展和变化来制定出新的方案,或者根据形势的发展和变化来选择相应的方案,最终实现目标。

    (引用百度百科)

    什么是策略模式

    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

    策略模式:

    • 定义了一族算法(业务规则);
    • 封装了每个算法;
    • 这族的算法可互换代替(interchangeable)。

    策略模式UML图

    (引用维基百科)

    类图

    stragy_pattren_uml.png

    • Client

      发起算法调用

    • Context(客户端)

      持有具体策略实现的引用,调用策略接口API,进行方法调用。

      可以持有全部策略引用,根据不同的策略标识获取已初始化的策略类,进而执行对应的策略行为。也可以通过构造方法传入策略类。

    • Strategy(策略接口)

      决定实现策略所必需的接口。

    • AddStrategy(具体策略实现者)

      实现策略接口,具体策略有不同的实现方式。达到解耦的目的。

    实现

    注。以下实现参考 <Head First 设计模式>

    strategy_pattern_h1.png

    1. 定义策略接口

    /**
     * 剥离出来的特定的飞行行为
     */
    public interface FlyBehavior {
        void fly();
    }
    
    
    /**
     * 剥离出来的特定的呼叫行为
     */
    public interface QuackBehavior {
        void quack();
    }
    

    2. 定义策略实现类

    public class Quack implements QuackBehavior{
        @Override
        public void quack() {
            System.out.println("定义会呱呱叫的鸭子行为!!!");
        }
    }
    
    public class FlyWithWings implements FlyBehavior{
        @Override
        public void fly() {
            System.out.println("定义会飞的鸭子行为!!!");
        }
    }
    

    3. 定义Duck超类

    /**
     * 鸭子超类
     * 需求一: 需要会飞的鸭子。
     *      会飞这个动作并不是所有鸭子都具备的行为。如果在超类上加上新的行为,将会使得某些子类具有这个不恰当的行为。
     *   方式一: 定义新的接口。让需要的这种鸭子行为的类实现它。但这不是一个好的办法。每当新增一个鸭子的种类,都要去实现这个接口。×
     *   如果每次新的需求一来,都会变化到某方面的代码,那么你可以确定,这部分的代码需要被抽取出来。
     *   方式二: 为要要区分开 变化和不变化的部分。准备再组类。一是fly相关,一是quack相关
     *   当我们创建特定对象的时候,指定特定的类型的飞行行为给它。我们需要在鸭子超类中包含设定行为了方法。就可以在运行时动态地改变子类的飞行行为
     */
    public abstract class Duck {
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
    
        /**
         * 外观不同,定义抽象方法让子类实现
         */
        public abstract void display();
    
        /**
         * 呱呱叫
         */
        public void quack() {
            System.out.println("所有鸭子都会: 呱呱叫!!!");
        }
        /**
         * 游泳
         */
        public void swim() {
            System.out.println("所有鸭子都会: 游泳!!!");
        }
    
        public void performFly() {
            flyBehavior.fly();
        }
    
        public void performQuack() {
            quackBehavior.quack();
        }
    
    }
    

    4. 定义Duck实现类

    /**
     * 绿头鸭子
     */
    public class MallardDuck extends Duck{
        public MallardDuck() {
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }
        public void display() {
            System.out.printf("mallard duck.");
        }
    }
    
    /**
    * 闲鱼鸭
    */
    public class NothingDuck extends Duck {
        @Override
        public void display() {
            System.out.println("Nothing duck");
        }
    }
    

    5. Main

    /**
     * 不再把鸭子的行为说成「一组行为」,我们开始把行为想成是「一族算法」
     * 鸭子的行为不是继承而来,而是和适当的行为对象组合而来。
     * 设计原则: 多用组合,少用继承。
     */
    public class T {
        public static void main(String[] args) {
            MallardDuck mallardDuck = new MallardDuck();
            mallardDuck.performFly();
            mallardDuck.performQuack();
    
            System.out.println("--------Nothing Duck--------------");
            NothingDuck nothingDuck = new NothingDuck();
            nothingDuck.performFly();
        }
    }
    

    总结

    1. 针对接口编程,而不是针对实现编程
    2. 无论何时你需要修改某个行为,你必须得往下追踪并修改每一个定义此行为的类,一不小心,可能造成新的错误。换句话说,如果每次新的需求一来,都会变化到某方面的代码,那么你就可以确定,这部分的代码需要被抽出来,和其他闻风不动的代码有所区隔。
    3. 把会变化的部分取出并封装起来,以便以后可以轻易地扩充此部分,而不影响不需要变化的其他部分。
    4. 针对接口编程,关键就在多态。利用多态,程序可以针对超类编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类的行为上。
    5. 策略模式提供了对"开闭原则"完美支持,用户可以在不修改原有系统的基础上选择算法行为,也可以灵活的增加新的算法行为。
    6. 策略模式提供了可替换继承关系的办法。继承使得动态改变算法或行为变得不可能。但是使用策略模式可以实现解耦。
    7. 策略模式缺点是使用者必须知道所有策略类,并自行决定使用哪一个策略类。也就意味着使用者必须理解这些算法之间的区别,以便在恰当的时机选择恰当的算法类。
    展开全文
  • 在如下情况下使用合成模式:1、需要描述对象的部分和整体的等级结构2、需要客户端忽略掉个体构件和组合构件的区别。客户端必须平等对待所有的构件,包括个体构件和组合构件。合成模式有两种形式,分别为安全式和透明...

     

    合成(Composite)模式的结构图

    合成模式是将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与符合元素同等看待。在如下情况下使用合成模式:

    1、需要描述对象的部分和整体的等级结构2、需要客户端忽略掉个体构件和组合构件的区别。客户端必须平等对待所有的构件,包括个体构件和组合构件。

    合成模式有两种形式,分别为安全式和透明式

    透明式

    Component里面声明所有的用来管理子类对象的方法,包括add()remove(),以及getChild()方法。这样做的好处是所有的构件类都有相同的接口。在客户端看来,树叶类对象与合成类对象的区别起码在接口层次上消失了,客户端可以同等的对待所有的对象。这就是透明形式的合成模式。其缺点是不够安全,因为树叶类对象和合成类对象在本质上是有区别的。树叶类对象不可能有下一个层次的对象,因此add()remove()以及getChild()方法没有意义。

     


    安全式

    在树枝结构Composite类里面声明所有的用来管理子类对象的方法。这样的做法是安全的。缺点是不够透明,因为树叶类和合成类将具有不同的接口。

    二、合成模式在Java中的应用

    由于AWTSwing的图形界面构件是建立在AWT库中的Container类和Component类上的,从下面的AWT合成模式类图可以看出,ButtonCheckbox是树叶型的构件,而Container则是树枝型的构件。如下图所示:

    Container类中,有操作聚集的对应方法,而在Component类中则没有这样的方法。这就是说,AWT中使用的合成模式是安全形势的合成模式。

     

    展开全文
  • Struts2 的拦截器由若干个拦截器组成,拦截形势是正序拦截request,倒序返回返回拦截response,这正是责任链设计模式的典型事例。 简介 责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象...
  • 初识设计模式 chapter 09-迭代器组合模式 1 引言 有许多方法可以把对象堆起来成为一个集合(collection)。你可以把他们放进数组、堆栈、或者是散列表中,这是你的自由。每一种都有它自己的...
  • OCC++的区别参考汇总: C++OC同为面向对象设计语言,他们有很多相似的对象,但是由于两者属于不同的面向对象学派。因此两者之间的比较也乐此不疲。下面简要说说他们的区别:  1.继承:Objective-C同...
  • 适配器模式

    千次阅读 2016-12-30 11:51:42
    1.基本作用:适配器模式可以将一个类的接口和另一个类的接口匹配起来。2.下面我们来举一个java io中的一个适配器实例 InputStream:是表示字节输入流的所有类的超类。 Reader:是用于读取字符流的抽象类。 ...
  • 2. 根据形势发展而制定的行动方针和斗争方法;3. 有斗争艺术,能注意方式方法。总的来说呢就是针对一个目的的不同的方法集合。这里要讲的策略模式怎么理解呢?简单的说就是对于一个类的行为或者其算法可以在运行时...
  • 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 封装:把行为用接口封装起来,我们可以把那些经常变化的部分,从当前的类中单独取出来,用接口进行单独的...
  • 浅谈To BTo C的区别

    万次阅读 多人点赞 2019-10-23 15:07:46
    随着互联网时代技术的蓬勃发展,To BTo C这两个词语兴起,从最初的概念阶段,到产品(系统、平台)的出现,到涉及的业务领域,再到提供的服务,甚至是涉及的职业都相应的将两者进行了一定的区分,近期市面上To B...
  • 最近一直在学习设计模式,但是一直没有...2. 根据形势发展而制定的行动方针和斗争方法;3. 有斗争艺术,能注意方式方法。 策略模式:定义了算法家族,分别封装起来,让他们之间相互替换,这种模式不会影响到使用...
  • 2. 根据形势发展而制定的行动方针和斗争方法;3. 有斗争艺术,能注意方式方法。 换句话说就是,之前我辰哥有句名言“我有100种方法让你死无葬身之地!”,这里的100中方法就是100种策略。 主要解决:在有多种算法...
  • 根据形势发展而制定的行动方针和斗争方法; ③. 有斗争艺术,能注意方式方法 2、策略模式:策略模式是处理算法的不同变体的一种行为模式,通过在抽象策略中定义算法接口或封装算法标识,实现...
  • 浅谈工业互联网产业互联网区别

    千次阅读 2019-12-04 09:08:26
    随着互联网技术兴起,国内出现了很多关于互联网的词语,例如:行业互联网、产业互联网、工业互联网等,其中被提及频率最高,也是当下吵得较火的,非产业互联网工业互联网莫属了,这两个概念在信息化发展政策推动...
  • 组合模式

    2012-09-08 11:36:49
    但是个体整体的访问一致性,可能需要特别注意一下。先看看GOF给出的模式意图。 将对象组合成树形结构以表示“部分-整体”的层次结构,使用户对单个对象和组合对象的使用具有一致性。 也是就是说: 1、...
  • 确保系统已经安装了VIM工具 [root@panda ~]# rpm -qf `which vim` ...答:NO,vim是vi的增加版,最明显的区别就是vim可以语法加亮,它完全兼容vi 5.1.1 vim编辑器模式 首次进入文件 ---- 命令模式 出现 ...
  • 提到这个,为什么两种模式中都有“连锁”字样呢? 想要解答这个问题,先得了解什么是连锁店。然后才能继续谈加盟直营的详细区别 目录 1. 连锁店的定义 2.加盟连锁直营连锁的区别 3.连锁加盟五大注意事项 1...
  • 大数据架构和模式

    万次阅读 2016-03-14 12:10:41
    对数据进行分类后,就可以将它合适的大数据模式匹配: 分析类型 — 对数据执行实时分析还是批量分析。请仔细考虑分析类型的选择,因为这会影响一些有关产品、工具、硬件、数据源和预期的数据频率的其他决策。一些...
  • 四、美团点评的模式弊病 美团点评百度、58同城一样,都是流量买卖赚取广告的模式,没有本质区别。当然,几乎所有传统互联网公司都是这样模式。美团点评,当然也意识到了这种模式的弊端,所以,美团点评在过去几年...
  • 互联网商业模式

    2012-04-28 16:47:27
    第一类 传统门户 [ 观点 ] ...各种应用系统、数据资源和互联网资源在这里可以快速地完成企业对客户、企业对内部员工和企业对企业的传输反馈,促进交易便捷、快速完成,有人形象地把门户网站比...
  • localStorage和sessionStorage的区别
  • 互联网十大商业模式

    千次阅读 2014-09-13 13:46:34
    互联网十大商业模式   第一类 传统门户    [ 观点 ]  ... 门户网站,本质上说...各种应用系统、数据资源和互联网资源在这里可以快速地完成企业对客户、企业对内部员工和企业对企业的传输反馈,促进交易便...
  • 网络媒体十八种赢利模式

    千次阅读 2006-04-12 13:25:00
    网络媒体其他网站相比,它应该有更大的优势,别人没有的优势,媒体网络有,别的网站能做的,媒体网络同样可以做。很多传媒投资经营失利,都是因为没有找到或者不知道什么是赢利模式。在网络的战国时期,媒体网络...
  •  DR 模式因为只修改 package的 MAC地址通过ARP广播的形势找到realserver,所以 要求LVS 的VIP 和realserver的IP 必须在同一个网段内,也就是在挂载VIP 时先确认LVS的工作模式,如果是DR模式需要先确认这个IP 只是否...
  • 设计模式浅析

    2019-09-24 04:17:06
    面向对象编程3大特性7大原则一、面向对象的特性三个基本的特性:封装、继承多态。1、封装面向对象编程核心思想这一就是就是将数据和对数据的操作封装在一起.通过抽象,即从具体的实例中抽取共同的性质形成一般的...
  • 他人合作,带领他们从一个位置到另一个位置。项目经理所选择的方法体现了他们在行为、自我认知和项目角色方面的显著差异。表 3-1 从几个重要的层面对管理和领导力进行比较。 为获得成功,项目经理必须同时采用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,752
精华内容 2,700
关键字:

形式与模式的区别