<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>中的 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E4%B8%AD%E7%9A%84/</link><description>Recent content in 中的 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 22 Nov 2018 19:05:57 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E4%B8%AD%E7%9A%84/index.xml" rel="self" type="application/rss+xml"/><item><title>Python 中的单例模式</title><link>https://pangyd.com/post/209-python/</link><pubDate>Sun, 11 Nov 2018 08:35:05 +0800</pubDate><guid>https://pangyd.com/post/209-python/</guid><description>&lt;pre>&lt;code class="language-python hljs">&lt;ol class="hljs-ln">&lt;li>&lt;h2 id="单例模式">单例模式&lt;/h2>

&lt;p>&lt;b>单例模式（Singleton Pattern）&lt;/b>是一种常用的软件设计模式，该模式的主要目的是&lt;b>确保某一个类只有一个实例存在&lt;/b>。当你希望在整个系统中，某个类只能出现一个实例时，单例对象就能派上用场。&lt;/p>

&lt;p>比如，某个服务器程序的配置信息存放在一个文件中，客户端通过一个 AppConfig 
的类来读取配置文件的信息。如果在程序运行期间，有很多地方都需要使用配置文件的内容，也就是说，很多地方都需要创建 AppConfig 
对象的实例，这就导致系统中存在多个 AppConfig 的实例对象，而这样会严重浪费内存资源，尤其是在配置文件内容很多的情况下。事实上，类似 
AppConfig 这样的类，我们希望在程序运行期间只存在一个实例对象。&lt;/p>

&lt;p>在 Python 中，我们可以用多种方法来实现单例模式：&lt;/p>

&lt;ul>
&lt;li>使用模块&lt;/li>
&lt;li>使用 __new__&lt;/li>
&lt;li>使用装饰器（decorator）&lt;/li>
&lt;/ul>

&lt;h2 id="使用模块">&lt;a name="t1">&lt;/a>使用模块&lt;/h2>

&lt;p>其实，Python 的模块就是天然的单例模式，因为模块在第一次导入时，会生成 .pyc 文件，当第二次导入时，就会直接加载 .pyc 
文件，而不会再次执行模块代码。因此，我们只需把相关的函数和数据定义在一个模块中，就可以获得一个单例对象了。如果我们真的想要一个单例类，可以考虑这样做：&lt;/p>

&lt;pre class="prettyprint" name="code">&lt;code class="hljs python has-numbering">&lt;span class="hljs-comment"># mysingleton.py&lt;/span>
&lt;span class="hljs-class">&lt;span class="hljs-keyword">class&lt;/span> &lt;span class="hljs-title">My_Singleton&lt;/span>&lt;span class="hljs-params">(object)&lt;/span>:&lt;/span>
 &lt;span class="hljs-function">&lt;span class="hljs-keyword">def&lt;/span> &lt;span class="hljs-title">foo&lt;/span>&lt;span class="hljs-params">(self)&lt;/span>:&lt;/span>
 &lt;span class="hljs-keyword">pass&lt;/span>

my_singleton = My_Singleton()&lt;/code>&lt;/pre>
&lt;p>将上面的代码保存在文件 mysingleton.py 中，然后这样使用：&lt;/p>
&lt;pre class="prettyprint" name="code">&lt;code class="hljs python has-numbering">&lt;span class="hljs-keyword">from&lt;/span> mysingleton &lt;span class="hljs-keyword">import&lt;/span> my_singleton

my_singleton.foo()&lt;/code>&lt;/pre>
&lt;h2 id="使用-new">&lt;a name="t2">&lt;/a>使用 __new__&lt;/h2>
&lt;p>为了使类只能出现一个实例，我们可以使用 __new__ 来控制实例的创建过程，代码如下：&lt;/p>
&lt;pre class="prettyprint" name="code">&lt;code class="hljs python has-numbering">&lt;span class="hljs-class">&lt;span class="hljs-keyword">class&lt;/span> &lt;span class="hljs-title">Singleton&lt;/span>&lt;span class="hljs-params">(object)&lt;/span>:&lt;/span>
 _instance = &lt;span class="hljs-keyword">None&lt;/span>
 &lt;span class="hljs-function">&lt;span class="hljs-keyword">def&lt;/span> &lt;span class="hljs-title">__new__&lt;/span>&lt;span class="hljs-params">(cls, *args, **kw)&lt;/span>:&lt;/span>
 &lt;span class="hljs-keyword">if&lt;/span> &lt;span class="hljs-keyword">not&lt;/span> cls._instance:
 cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) 
 &lt;span class="hljs-keyword">return&lt;/span> cls._instance 

&lt;span class="hljs-class">&lt;span class="hljs-keyword">class&lt;/span> &lt;span class="hljs-title">MyClass&lt;/span>&lt;span class="hljs-params">(Singleton)&lt;/span>:&lt;/span> 
 a = &lt;span class="hljs-number">1&lt;/span>&lt;/code>&lt;/pre>
&lt;p>在上面的代码中，我们将类的实例和一个类变量 _instance 关联起来，如果 cls._instance 为 None 则创建实例，否则直接返回 cls._instance。&lt;/p></description></item><item><title>Java 中的异常和处理详解</title><link>https://pangyd.com/post/122-java/</link><pubDate>Tue, 03 Oct 2017 19:16:17 +0800</pubDate><guid>https://pangyd.com/post/122-java/</guid><description>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;strong>&lt;span>简介&lt;/span>&lt;/strong>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>程序运行时，发生的不被期望的事件，它阻止了程序按照程序员的预期正常执行，这就是异常。异常发生时，是任程序自生自灭，立刻退出终止，还是输出错误给用户？或者用C语言风格：用函数返回值作为执行状态？。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Java提供了更加优秀的解决办法：异常处理机制。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>异常处理机制能让程序在异常发生时，按照代码的预先设定的异常处理逻辑，针对性地处理异常，让程序尽最大可能恢复正常并继续执行，且保持代码的清晰。&lt;/p>&lt;p>Java中的异常可以是函数中的语句执行时引发的，也可以是程序员通过throw 语句手动抛出的，只要在Java程序中产生了异常，就会用一个对应类型的异常对象来封装异常，JRE就会试图寻找异常处理程序来处理异常。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Throwable类是Java异常类型的顶层父类，一个对象只有是 Throwable 类的（直接或者间接）实例，他才是一个异常对象，才能被异常处理机制识别。JDK中内建了一些常用的异常类，我们也可以自定义异常。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;strong>&lt;span>Java异常的分类和类结构图&lt;/span>&lt;/strong>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Java标准裤内建了一些通用的异常，这些类以Throwable为顶层父类。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Throwable又派生出Error类和Exception类。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>错误：Error类以及他的子类的实例，代表了JVM本身的错误。错误不能被程序员通过代码处理，Error很少出现。因此，程序员应该关注Exception为父类的分支下的各种异常类。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>异常：Exception以及他的子类，代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用，是异常处理的核心。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p style="text-align: center">&lt;img class="" title="858860-20170911125844719-1230755033" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.png" data-ratio="0.637883008356546" data-w="718" data-type="png" src="https://pangyd.com/uploads/2017/10/74c10f869f038762.png" data-fail="0">&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>总体上我们根据Javac对异常的处理要求，将异常类分为2类。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>非检查异常（unckecked exception）：Error 和 RuntimeException 以及他们的子类。javac在编译时，不会提示和发现这样的异常，不要求在程序处理这些异常。所以如果愿意，我们可以编写代码处理（使用try…catch…finally）这样的异常，也可以不处理。对于这些异常，我们应该修正代码，而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException，错误的强制类型转换错误ClassCastException，数组索引越界ArrayIndexOutOfBoundsException，使用了空对象NullPointerException等等。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>检查异常（checked exception）：除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作（使用try…catch…finally或者throws）。在方法中要么用try-catch语句捕获它并处理，要么用throws子句声明抛出它，否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下，而程序员无法干预用户如何使用他编写的程序，于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>需要明确的是：检查和非检查是对于javac来说的，这样就很好理解和区分了。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;strong>&lt;span>初识异常&lt;/span>&lt;/strong>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>下面的代码会演示2个异常类型：ArithmeticException 和 InputMismatchException。前者由于整数除0引发，后者是输入的数据不能被转换为int类型引发。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;blockquote>&lt;p>&lt;span>package com.example;&lt;/span>&lt;/p>&lt;p>&lt;span>import java. util .Scanner ;&lt;/span>&lt;/p>&lt;p>&lt;span>public class AllDemo&lt;/span>&lt;/p>&lt;p>&lt;span>{&lt;/span>&lt;/p>&lt;p>&lt;span>&amp;nbsp; &amp;nbsp; &amp;nbsp; public static void main (String [] args )&lt;/span>&lt;/p></description></item></channel></rss>