精华内容
下载资源
问答
  • 如果你想用JavaScript做一些高级的事情,例如打造组件库,封装插件,一定离不开“”和继承,这是“封装”里无法绕过的环。 为什么要给“”加上引号呢? 因为JavaScript的世界里根本没有,所有你见到的,...

    如果你想用JavaScript做一些高级的事情,例如打造组件库,封装插件,一定离不开“类”和继承,这是“封装”里无法绕过的一环。
    为什么要给“类”加上引号呢?
    因为JavaScript的世界里根本没有类,所有你见到的类,包括ES6里的新语法class,都不是真正的类,JavaScript是彻头彻尾的,纯粹到极致的面向对象语言,一切皆对象。
    我劝你最好暂时忘了之前接触过的所有面向对象语言。因为他们可能早已深深地误导了你。
    JavaScript的“类”和继承实际上是利用原型链来实现的。例如下面的代码:
    在这里插入图片描述
    这是js一个最常用的利用构造函数声明类的形式,里面有我们熟悉的new关键词,表面上看确实是先有了Foo类然后用new实例化了一个对象。
    但实际上Foo只是一个函数,它和其它函数没有什么不同,函数也是对象,直接像普通函数一样直接调用Foo也不会出错,加上new之后只是多了几个操作:

    1. 创建一个新对象;
    2. 执行Foo函数,并将Foothis绑定到新对象;
    3. 把新对象的_proto_指向Fooprototype
    4. 如果Foo方法没有返回其它内容的话,返回这个新对象;
      这里我们看到a1并没有say()方法,但是a1.say()却正常运行了,这是原型链的作用,a1没有say属性,就去原型上查找,最终在Foo.prototype里找到。
      关于什么是原型链这里就不细说了,这属于js基础,不在高级讨论范围内。
      上面代码本质上我们是利用一个函数对象(Foo)又创建了另一个对象(a1),根本没有传统意义上的类!
      嗯?等一下!利用对象生成对象?这不应该是Object.create()该干的事儿吗?没错,上面的代码完全可以利用Object.create()重构!
      在这里插入图片描述
      这种写法更符合JavaScript一切皆对象的说法!而且更加清楚易懂,原型链从上到下清晰可见。
      JavaScript的new真是个千古大忽悠!还有更忽悠的,ES6里的class,让js的本质更加扑朔迷离:
      在这里插入图片描述
      多么美丽的代码,多么让人沉浸无法自拔,当当当!给我清醒点!千万别让它美丽的外表迷惑!它的本质跟第一段代码完全一样!语法糖而已,实际上这里并没有真正的类,class 仍然是通过 [[Prototype]]机制实现的。
      我们再来看看继承。
      因为JavaScript没有真正的类,所以所谓的继承也都是一些掩人耳目的做法,通过各种恶心的手段达到复用和重写的目的,来看看有多恶心:
      在这里插入图片描述
      代码里SubFoo继承了Foo,并且SubFoo重写了Foo的say方法,里面充满了大量的xxx.prototype,为了让SubFoo和Foo扯上关系,必须让它们的原型链链接起来:SubFoo.prototype = Object.create(Foo.prototype)。还有许多难以理解的借调(xxx.call()),特别是为了达到继承Foo的say方法而写的这一句:Foo.prototype.say.call(this),多么的丑陋。对于当初涉世未深的你能理解这几句代码里面的含义吗?为了理解这些你花了多久?
      为了我脑袋上所剩无几的头发,呸!
      当然有了ES6后情况有所好转:
      在这里插入图片描述
      还是那句话,语法糖而已,本质上还是要让Foo和SubFoo两个小东西互相扯来扯去,如果再深入一点——加上二级、三级继承——情况会无法想象地复杂。
      说到底这些其实都是强行使用类的思想来理解JavaScript的一切皆对象而出现的“变态”代码。如果你放下屠刀,换一个思路,使用JavaScript语言最初的设计思路就会发现,一切其实非常简单,我们用一切皆对象的思路再来实现一遍上面的逻辑:
      在这里插入图片描述
      怎么样?没有了乱七八糟的prototype和构造函数,不用担心原型链的走向,一切清新自然,而且最重要的,一切都是对象。
      这种实现方式的官方叫法(非人话叫法)就是“行为委托”。在行为委托模式中,Foo和 SubFoo只是对象,它们之间是兄弟关系,并不是父类和子类的关系。代码中 Foo委托了 SubFoo,反向委托也完全没问题,我们也不需要实例化类,因为它们根本就不是类,它们只是对象。此外,我们摆脱了一大堆的prototype和借调,我们使用了一种极其简单的方式完成了封装。
      当然往深处里讲,上述几种方式每个方式都有自己的优缺点。不能很武断地说这个好那个不好,在不同场景里选择最合适的实现方式是作为一名高级技术人员时刻该考虑的事情。
    展开全文
  • 使用此工具可以轻松将商店的内容复制到另商店,从而建立个分阶段的环境,或者只是简单测试产品,而不会冒任何生产风险。 它支持什么 使用此工具,您可以同步/复制以下资源: 产品(及其变体,包括图像,alt...
  • php高级开发教程说明

    2008-11-27 11:39:22
    可能是在个完全不同的项目中—你可能会再次需要种类似的工具,仅仅遍又 重做目录列举器,每个对应个特定的任务,这简直是在浪费时间。因此,当首次遇到这种 情况时,应该考虑到这一点,应从个...
  • linux高级程序设计

    2015-12-17 09:35:27
    本书不仅仅是另外本UNIX编程图书,它试图解释为什么Linux这么成功,并向读者展示在这个主题上被其他图书一笔带过或完全忽略的系统中的某些部分。 在本书中,你将学习到是什么推动了Linux的开发过程。你将了解...
  • 轻量Django

    2018-05-14 12:24:14
    自Django 创建以来,各种各样的开源社区已经构建了很多Web 框架,比如JavaScript 社区创建的Angular.js 、Ember.js 和Backbone.js 之面向前端的Web 框架,它们是现代Web 开发中的先驱。Django 从哪里入手来适应...
  • 在编写本书的第二版时,我们意识到自己并不太喜欢这个名称,因此决定将本书重命名为“现代统计概论”,以更好反映本书所涵盖的内容。不仅具有基于仿真的推理功能,而且还具有许多非推理主题! 如果您正在寻找...
  • XML高级编程

    2012-05-30 12:02:59
    第2章给了我们基本语法概念,第3章告诉我们如何以种每个XML编程者都能够理解的方式正规定义XML词汇表。这些章节提供了理解和使用XML所必需的最基本内容。第4章(关于数据建模)在创建良好的XML结构方面为读者...
  • 算法的基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 (3)算法的3种基本控制结构 算法的3种基本控制结构是:顺序结构、选择结构、循环结构。 (4)算法基本设计方法 算法基本设计方法:列举法、...
  • 17、多城市版本:支持多城市间自由切换,不同城市可采用独立二域名,系统根据浏览者IP自动跳转所在城市,分站有独立的广告管理,每个分站可设置独立管理员,分站拥有独立的SEO优化设置可设置不同的关键词描述。...
  • Android高级编程--源代码

    热门讨论 2013-02-06 17:39:21
    因此,对Android感兴趣的开发人员都把Google在2008年发布Android这举措作为移动技术发展史上的个非常令人期待的重大事件。  由于Android构建在开源代码的框架之上,而且提供了强大的SDK库和开放的理念,所以它...
  • LINQ高级编程 7/7

    2012-03-31 16:13:13
    个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是系列标准查询操作符的集合,这些操作符几乎对每种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。...
  • LINQ高级编程 6/7

    2012-03-31 16:08:42
    个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是系列标准查询操作符的集合,这些操作符几乎对每种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。...
  • LINQ高级编程 5/7

    2012-03-31 16:05:02
    个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是系列标准查询操作符的集合,这些操作符几乎对每种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。...
  • LINQ高级编程 4/7

    2012-03-31 15:59:10
    个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是系列标准查询操作符的集合,这些操作符几乎对每种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。...
  • LINQ高级编程 3/7

    2012-03-31 15:54:58
    个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是系列标准查询操作符的集合,这些操作符几乎对每种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。...
  • LINQ高级编程 2/7

    2012-03-31 15:51:12
    个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是系列标准查询操作符的集合,这些操作符几乎对每种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。...
  • LINQ高级编程 1/7

    2012-03-31 15:43:15
    个问题(以及随后的其他两个问题)的答案是,语言集成查询(LanguageIntegrated Query,LINQ)是系列标准查询操作符的集合,这些操作符几乎对每种数据源的导航、过滤和执行操作都提供了底层的基本查询架构。...
  • Android高级编程--详细书签版

    热门讨论 2013-02-06 17:37:52
    因此,对Android感兴趣的开发人员都把Google在2008年发布Android这举措作为移动技术发展史上的个非常令人期待的重大事件。  由于Android构建在开源代码的框架之上,而且提供了强大的SDK库和开放的理念,所以它...
  • 机器学习中,这形式的集合有什么有点合缺点?习题2:∅的基数是多少?{∅}习题5:多标签学习中,输出为个向量,相应的学习器算不算函数呢?习题6:元组只能表达对象的数据部分, 还是可以完整表达 (既包括数据,...

    习题1{0,1,{0,1},{1,2}}有几个元素?机器学习中,这类形式的集合有什么有点合缺点?

    答:如果一个集合S中恰有n(n≥0)个不同的元素,我们就说S是有限集,而n是S的基数。S的基数记为∣S∣。集合{0,1,{0,1},{1,2}}有4个元素,基数为4。

    优点:集合对元素类型或顺序没有要求,集合中可以包含多种数据类型。

    缺点:集合内的数据类型多样且无序,处理起来较麻烦

    习题2:∅的基数是多少?{∅}

    答:一个常见的错误是混淆空集∅和单元素集合{∅}。空集∅表示的是一个特殊的不含任何元素的集合。所以空集的基数为0;集合{∅}的唯一元素是空集本身!考虑计算机文件系统中的文件夹做一个类比有助于记住这个区别。空集可以比做一个空的文件夹,而仅包含一个空集的集合可以比做一个文件夹里只有一个文件夹,即空文件夹。

    习题5:多标签学习中,输出为一个向量,相应的学习器算不算函数呢?

    答:多标签的学习器算函数。多标签学习是指对一个样本同时预测出多个类别标记,例如一副图画可同时标注为”蓝天“、”白云“、”羊群“、”自然场景“,乍一看多标签学习好像由同一个输入得到了多个输出。其实不然,多标的输出是一个向量,向量的每一个维度代表了不同的输出,可以把每一个维度都当作一个函数,同一个输入,经过不同的函数处理,得到每一个维度唯一的输出,是符合函数的定义的,所以多标签学习器算函数。

    习题6:元组只能表达对象的数据部分, 还是可以完整地表达 (既包括数据, 也包括方法/函数)? 用一个具体的程序来说明.

    答:一个元组可以看作是一个类,不仅可以表达对象的数据,也可以表达对象的方法

    public class Human {
         public Head head;//头
         public Body body;//身体
         public Hand [] hands;//手的集合
         public Leg [] legs;//腿的集合
         public int age;//人的年龄
         public boolean gender;//性别
        //人可以跑
        public void run(){
             //跑的快慢
         }
         //人要吃饭
        public void eat(){
            //吃的有多有少
        }
        //...
    }
    class Head{
         //头有眼睛、鼻子、耳朵...
    }
    class Body{
        //身体有胖有瘦
    }
    class Hand{
        //手有长有短
    }
    class Leg{
        //腿有长有短
    }
    

    习题 7: 定义二叉树.

    Definition 7.Let Σ={l,r}\Sigma=\lbrace l,r\rbrace be the alphbet and \empty be a null node. A binary tree is a triple T=(V,r,c)T=(V,r,c),where V={v1,v2...,vn}V=\lbrace v_1,v_2...,v_n\rbrace is the set of nodes rVr\in V is the root and c:V{}×Σ+V{}c:V\cup\lbrace\empty\rbrace\times\Sigma^+\to V\cup\lbrace\empty\rbrace satisfying
    a) c(,l)=c(,r)=c(\empty,l)=c(\empty,r)=\empty;
    b)vV\{r}\forall v \in V\backslash\lbrace r\rbrace,sΣ+s\in \Sigma^+ st. c(r,s)=vc(r,s)=v;
    c)vV\forall v \in V,!sΣ+!\exists s\in \Sigma^+ st.c(v,s)=vc(v,s)=v

    习题 8: 定义带权无向图.

    答:Difinition. AA weighted undirected graph is a tupleGw=(V,E,w),G_w=(V,E,w),where V={v1,v2...vn}V= \lbrace v_1,v_2...v_n \rbrace is the set of nodes,EV×VE\subseteq V\times V is the set of edge, and vi,vjE\langle v_i,v_j\rangle\in E iff vi,vjE\langle v_i,v_j\rangle\in E, w:V×VR+{0}w:V\times V\to R^+\cup\lbrace 0\rbrace is the edge weight.

    习题 9. 考虑 ϕ\phi, 重新写 Definition 7 以解决其存在的问题, 见其讨论 d).

    Definiton 7.A tree is a triple T=(V,r,p)T=(V,r,p),where V={v1,...vn}{ϕ}V=\lbrace v_1,...v_n\rbrace\cup\lbrace\phi\rbrace is the set of nodes,rVr\in V is the root, and p:V\{r}Vp:V\backslash \lbrace r\rbrace\to V is the parent function satisfying
    a) k1,pk(v)v,and\forall k\geq1,p^k(v)\neq v, and
    b)vV\{r},\forall v \in V\backslash \lbrace r\rbrace,\exist 1k1,k\geq1,st.pk(v)=rp^k(v)=r
    c)if r{ϕ}r\in \lbrace \phi \rbrace, p(r)=ϕp(r)=\phi

    习题 3.1 模仿自动机的样子来重新定义二叉树.

    Definition 8:A binary tree is a 5-tuple T=(Σ,Q,q0,M,f)T=(\Sigma,Q,q_0,M,f), where Σ={l,r}\Sigma=\lbrace l,r\rbrace, Q={v1,....,vn}{ϕ}Q=\lbrace v_1,....,v_n\rbrace\cup\lbrace \phi\rbrace, {v1,...,vn}\lbrace v_1,...,v_n\rbrace is the set of nodes,q0{v1,...,vn}q_0\in \lbrace v_1,...,v_n\rbrace is the root, M{ϕ}M\in\lbrace \phi\rbraceand f:Q×ΣQf:Q\times\Sigma^*\to Q satisfying vQ\{ϕ},1sΣ\forall v\in Q\backslash \lbrace\phi\rbrace,\exists1 s\in \Sigma^* st. f(q0,s)=vf(q_0,s)=v.

    习题3.2 模仿自动机的样子来重新定义树.

    Definition 9:A tree is a 5-tuple T=(Σ,Q,q0,M,f)T=(\Sigma,Q,q_0,M,f), where Σ={1,...,n}\Sigma = \lbrace 1,...,n\rbrace, Q={v1,....,vn}{ϕ}Q=\lbrace v_1,....,v_n\rbrace\cup\lbrace \phi\rbrace, {v1,...,vn}\lbrace v_1,...,v_n\rbrace is the set of nodes,q0{v1,...,vn}q_0\in \lbrace v_1,...,v_n\rbrace is the root, M{ϕ}M\in\lbrace \phi\rbrace and f:Q×ΣQf: Q\times \Sigma^*\to Q satisfying vQ\{ϕ},1sΣ\forall v\in Q\backslash \lbrace\phi\rbrace,\exists1 s\in \Sigma^* st. f(q0,s)=vf(q_0,s)=v.
    Σ={1,...,n}\Sigma =\lbrace 1,...,n\rbrace ,其中1到n代表了n叉树的节点从左到右的n条分支.

    展开全文
  • Oracle专家高级编程--详细书签版

    热门讨论 2012-08-21 11:57:09
    Thomas Kyte就是主持Oracle Magazine Ask Tom专栏和Oracle公司同名在线论坛的那个Tom,他通过这方式热心回答困扰着Oracle开发人员和DBA的各种问题。 目录 封面 -31 封底 -30 书名 -29 版权 -28 出版者的话 -27...
  • Django作为Python Web开发框架的哥,提供了企业网站开发所需要的几乎所有功能,其中就包括自带分页功能。利用Django自带的Paginator,我们可以很轻松实现分页。Django 2.0和1.X最大的不同在于新增了get_page...

    Django作为Python Web开发框架的一哥,提供了企业级网站开发所需要的几乎所有功能,其中就包括自带分页功能。利用Django自带的Paginator类,我们可以很轻松地实现分页。Django 2.0和1.X最大的不同在于新增了get_page()方法。我们现在来具体看看有什么不同。


    Django 1.X 和Django 2.0下实现分页


    利用Django实现分类非常简单,我们只需要修改views.py和模板template。Django 1.X下实现分页代码如下:


    # app/views.py - 基于函数的视图

    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    from .models import Article
    from django.shortcuts import render

    def article_list(request): article_list = Article.objects.all() paginator = Paginator(article_list, 10) # 实例化一个分页对象, 每页显示10个 page = request.GET.get('page') # 从URL通过get页码,如?page=3 try: articles = paginator.page(page) # 获取某页对应的记录 except PageNotAnInteger: # 如果页码不是个整数 articles = paginator.page(1) # 提取第一页的记录 except EmptyPage: # 如果页码太大,没有相应的记录 articles = paginator.page(paginator.num_pages) # 提取最后一页的记录 return render(request, 'article_list.html', {'articles': articles})


    你注意到没有?上段代码的try和2个except非常重要,但是看上去有些冗余。Django 2.0下新增了get_page()方法,可以将代码大大简化(如下图所示)。它所实现的功能与上面是一样的。当用户提交的页码不是整数时,提取第一页记录。当用户输入的页码太大时,只提取最后一页记录。

    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    from .models import Article
    from django.shortcuts import render

    def article_list(request): article_list = Article.objects.all() paginator = Paginator(article_list, 10) # 实例化一个分页对象, 每页显示10个 page = request.GET.get('page') # 从URL通过get页码,如?page=3
      articles = paginator.get_page(page) # 获取某页对应的记录, 如果 return render(request, 'article_list.html', {'articles': articles})


    Django 1.X和2.0下的模板是一样的。这里提供两种显示方案。

    模板一: 上一页, Page 1 of 3, 下一页

    #app/templates/app/article_list.html

    {% for article in articles %} 
       {{ article.title }}  
    {% endfor %}

    <div class="pagination">
       <span
    class="step-links">
           
    {% if articles.has_previous %}
               <a href="?page=1">&laquo; first</a>
               <a
    href="?page={{ articles.previous_page_number }}">previous</a>
           
    {% endif %}

           <span class="current">
               
    Page {{ articles.number }} of {{ articles.paginator.num_pages }}.
           </span>

           
    {% if articles.has_next %}
               <a href="?page={{ articles.next_page_number }}">next</a>
               <a
    href="?page={{ articles.paginator.num_pages }}">last &raquo;</a>
           
    {% endif %}
       </span>
    </div>


    模板二: Page 1, 2, 3, 4, 5, 6, 7, 8, ... (推荐)

    #app/templates/app/article_list.html

    # Pagination style 2
    {% for article in articles %}
       {{ article.title }}
    {% endfor %}
    <div class="pagination">
    <nav>
       <ul
    class="pagination">
           
    {% if articles.has_previous %}
           <li class="">
           <a
    href="?page={{ articles.previous_page_number }}" aria-label="Previous">
           <span
    aria_hidden="true">&laquo;</span></a>
           </li>
           
    {% endif %}
           
           {% for page_num in articles.paginator.page_range %}
               {% if page_num == articles.number %}
            <li class="active"><a href="?page={{ page_num }}">{{page_num}}</a> </li>
               
    {% else %}
            <li class=""><a href="?page={{ page_num }}">{{page_num}}</a> </li>
               
    {% endif %}
           {% endfor %}
           
           {% if articles.has_next %}
            <li class="">
                 <a
    href="?page={{ articles.next_page_number }}" aria-label="Next">
                     <span
    aria_hidden="true">&raquo;</span></a>
           </li>
         
    {% endif %}
       </ul>
    </nav>
    </div>


    Django如何在基于类的视图里使用分页?


    上述案例里我们使用了函数试图,很容易定义page对象, 并传递给模板,例如articles。但是如果我们希望使用基于类的视图,我们该如何实现分页呢?其实操作非常简单。我们只需在视图中加入paginate_by = number即可。

    from. models import Article
    from django.views.generic import ListView

    class ArticleListView(ListView):
       model = Article  # 等于 queryset = models.Article.objects.all()
       
    template_name = 'app/article_list.html'  # 可选的
       
    context_object_name = "article_list"    # 默认context名字
       
    paginate_by = 10  # 每页10项


    此时模板article_list.html也需要做出相应调整,如下图所示。Django会先对是否分页is_paginated做个判断,如果有,就会自动生成个page_obj分页对象传递到模板。

    {% if article_list %}
       {% for article in article_list %}
       {{ article.title }}
       {% endfor %}

       {% if is_paginated %}
       <ul class="pagination">
       
    {% if page_obj.has_previous %}
       <li>
           <span><a
    href="?page={{ page_obj.previous_page_number }}">Previous</a></span>
       </li>
       
    {% endif %}
       <li class="">
           <span>
    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>
       </li>
       
    {% if page_obj.has_next %}
    <li>
           <span><a
    href="?page={{ page_obj.next_page_number }}">Next</a></span>
       </li>
       
    {% endif %}
       </ul>

    {% else %}
       <h3>Articles</h3>
       <p>
    No article yet</p>
    {% endif %}


    本文【Python与Django大咖之路】原创,如果喜欢我的文章,欢迎关注我的微信公众号。


    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 802
精华内容 320
关键字:

一级地类包括什么