• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 26, comments - 2, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            2014年4月16日

            最近專職做起了Python,得積累些Python的知識。
            -----------------
            閱讀代碼的時候,看到了classmethod。staticmethod用的挺多,classmethod一直沒用過,感覺有些迷惑。
            Google了一篇文章,講的挺清楚:pyhton靜態(tài)方法和類方法。上面這篇文章主要講原理,我這里主要說說二者的相同和區(qū)別。
            1. 都可以通過類調(diào)用;
            2. 都可以通過對象調(diào)用;
            3. 都可以繼承和復(fù)寫;
            4. 都可以使用類屬性、類方法和類的靜態(tài)方法;
            5. 使用這些屬性或方法時,staticmethod必須直接通過類名進行調(diào)用,classmethod可以優(yōu)雅的通過參數(shù)cls調(diào)用。
            在進行屬性或方法調(diào)用時:staticmethod需要硬編碼指明方法的類,如果存在繼承,無法使用子類復(fù)寫的方法和屬性,比較適合用于對其他方法和屬性不依賴或依賴較少的情況;classmethod通過cls進行調(diào)用,這個cls是調(diào)用時傳入的類,可以是父類,也可以是子類,適合用于對其他方法和屬性依賴較多的情況,也適用于需要通過集成擴展的情況。

            下面的代碼,簡單試驗了兩者的區(qū)別,并通過staticmethod簡單的模擬了classmethod的操作:

            class Base(object):
                name = "Base"
                
                @classmethod
                def foo(cls):
                    print cls.name
                
                @staticmethod
                def foo_static1():
                    print Base.name
                
                @staticmethod
                def foo_static2(cls):
                    print cls.name

                @staticmethod
                def foo_static3(cls):
                    # if not isinstance(cls, type):
                    if isinstance(cls, Base):
                        cls = cls.__class__
                    print cls.name


            class A(Base):
                name = "A"
                def __init__(self):
                    self.name = "I am '%s'" % A.name
                    

            class B(Base):
                name = "B"
                def __init__(self):
                    self.name = "I am '%s'" % B.name
                
                @classmethod
                def foo(cls):
                    print "<%s>" % cls.name
                
                @staticmethod
                def foo_static1():
                    print "<%s>" % Base.name


            def testA():
                obj = A()
                obj.foo()
                obj.foo_static1()
                obj.foo_static2(A)
                obj.foo_static2(obj)
                obj.foo_static3(A)
                obj.foo_static3(obj)
                A.foo()
                A.foo_static1()

            def testB():
                obj = B()
                obj.foo()
                obj.foo_static1()


            def run_test(func, *args, **kwargs):
                print "======================="
                func(*args, **kwargs)
                print ""


            if __name__ == '__main__':
                run_test(testA)
                run_test(testB)
                

            posted @ 2014-04-16 12:01 小夜 閱讀(410) | 評論 (0)編輯 收藏

            2010年4月12日

            工作中經(jīng)常需要在正則表達式中使用方括號,比如匹配Linux系統(tǒng)命令行提示符“[root@localhost ~]# ”。在python中,可以使用正則表達式“[\[][^\[\]]*[\]][#|$] ”進行匹配,但在regex中此正則表達式無法正確匹配。
            由于man手冊中缺少對方括號轉(zhuǎn)義的介紹,本文對regex中方括號的使用進行測試,測試程序如下:

            #include <stdio.h>
            #include 
            <string.h>

            #include 
            <sys/types.h>
            #include 
            <regex.h>

            int main(int argc, char** argv)
            {
                    
            char * pattern, *mstr;
                    
            int x, z, lno = 0, cflags = REG_EXTENDED;
                    
            char ebuf[128], lbuf[256], format[32];
                    regex_t reg;
                    regmatch_t pm[
            10];
                    
            const size_t nmatch = 10;

                    pattern 
            = argv[1];
                    z 
            = regcomp(&reg, pattern, cflags);

                    
            if (z != 0)
                    
            {
                            regerror(z, 
            &reg, ebuf, sizeof(ebuf));
                            fprintf(stderr, 
            "%s: pattern '%s' \n",ebuf, pattern);
                            regfree(
            &reg);
                            
            return 1;
                    }


                    
            while(fgets(lbuf, sizeof(lbuf), stdin))
                    
            {
                            
            ++lno;
                            
            if ((z = strlen(lbuf)) > 0 && lbuf[z-1]== '\n') lbuf[z - 1= 0;

                            z 
            = regexec(&reg, lbuf, nmatch, pm, 0);
                            
            if (z == REG_NOMATCH)
                            
            {
                                    printf(
            "not match\n");
                                    
            continue;
                            }

                            
            else if (z != 0)
                            
            {
                                    regerror(z, 
            &reg, ebuf, sizeof(ebuf));
                                    fprintf(stderr, 
            "%s: regcom('%s')\n",
                                                    ebuf, lbuf);
                                    
            return 2;
                            }


                            
            if (pm[0].rm_so!=-1)
                                    printf(
            "%04d: %s\n", lno, lbuf);
                            
            for (x = 0; x < nmatch && pm[x].rm_so != -1++ x)
                            
            {
                                    mstr 
            = strndup(lbuf + pm[x].rm_so, pm[x].rm_eo-pm[x].rm_so);
                                    printf(
            " $%d: %s\n", x, mstr);
                                    free(mstr);
                            }

                            fflush(stdout);

                    }


                    regfree(
            &reg);
                    
            return 0;
            }
            下面是對正則表達式“[\[][^\[\]]*[\]][#|$] ” 的測試,顯然不符合要求。
            ./testreg "[\[][^\[\]]*[\]][#|$] "  
            [root@localhost bin]# 
            not match
            [a\]# 
            0005: [a\]# 
             $
            0: [a\]# 
            從簡單的開始先測試左括號“[”的匹配:
            ./testreg "[\[]+"
            a
            not match
            [
            0002: [
             $
            0: [
            [root@localhost bin]# 
            0003: [root@localhost bin]# 
             $
            0: [
            再測試右括號“]”:
            ./testreg "[\]]+"
            ]
            not match
            \]  
            0002: \]
             $
            0: \]
            -----------------
            .
            /testreg "[]]+"
            ]]
            0001: ]]
             $
            0: ]]
            兩個簡單的正則表達式可以看出:regex中左方括號需要轉(zhuǎn)義,右方括號不需要轉(zhuǎn)義。
            下面我們再來測試匹配一下任意非方括號字符:
            ./testreg "[^\[]]+" //對[轉(zhuǎn)義,不對]轉(zhuǎn)義
            [abc]
            0001: [abc]
             $
            0: c]
            .
            /testreg "[^\[\]]+" //對[和]轉(zhuǎn)義
            [abc]
            0001: [abc]
             $
            0: c]
            .
            /testreg "[^]\[]+" //對[轉(zhuǎn)義,不對]轉(zhuǎn)義,且把]放在^后使]不與前面的[匹配
            [abc]
            0001: [abc]
             $
            0: abc
            通過上面測試可以得出正確的正則表達式來匹配Linux命令行提示符——“[\[][^]\[]*[]][#$] ”或“\[[^]\[]*][#$] ”。

            posted @ 2010-04-12 13:14 小夜 閱讀(5619) | 評論 (0)編輯 收藏

            2009年10月16日

                 摘要: 1.命令介紹 最近學(xué)習(xí)并使用了一個python的內(nèi)置函數(shù)dir,首先help一下: >>> help(dir)Help on built-in function dir in module __builtin__:dir()    dir([object])...  閱讀全文

            posted @ 2009-10-16 20:32 小夜 閱讀(3118) | 評論 (0)編輯 收藏

            2009年9月23日

            就是很多庫和工具還不支持,等庫和工具都正常了,就轉(zhuǎn)用它了。

            posted @ 2009-09-23 19:58 小夜 閱讀(168) | 評論 (0)編輯 收藏

            2009年9月1日

             起因很簡單,不小心為一個文件關(guān)聯(lián)了默認打開方式,然后就eclipse中一打開該文件就出來個記事本,打開的時候只好使用右鍵,選擇打開方式,頗為繁瑣。

            于是,百度之。看到的第一種方法是直接修改注冊表,刪除擴展名對應(yīng)的注冊項,結(jié)果以失敗告終,用eclipse打開文件依然出來記事本,可能是修改的地方不對或不全。

            找到第二種方法,終于解決問題,記錄如下:打開Explorer,點擊菜單“工具 | 文件夾選項”,點擊“文件類型”,找到對應(yīng)的擴展名后刪除即可。

            對于我遇到的這個問題,還可以通過修改eclipse解決:點擊菜單“window | preferences”,進入“General | Editors | File Associations”,添加一個擴展名,然后設(shè)置一個默認打開方式即可。

            posted @ 2009-09-01 15:56 小夜 閱讀(342) | 評論 (0)編輯 收藏

            2009年6月23日

            面試中的趣味

            林子大了,什么鳥都有。

            面試是一件比較有意思的工作,能夠接觸形形色色的人。

            囂張的面試者

            最近面試了一個比較囂張的人,說是比較喜歡有挑戰(zhàn)的工作,離職主要是由于工作沒有挑戰(zhàn)性。看其筆試,并不是特別顯眼。

            他:在項目中我是讓測試者比較頭疼的人,本來安排10天干完的活,3天就干完了,我就找他們測試,測試人員比較煩,總得提前進行測試工作。

            我:一個項目總有一個項目的進度安排,測試和開發(fā)都如此。在多余的時間里,有沒有考慮做些其他的事情?

            他:我都天天看PDF了,還能干什么?

            我:沒有考慮做一些代碼質(zhì)量優(yōu)化類似的工作?

            他:……

            我:你感覺你這段代碼寫的怎么樣?(我指著他筆試的代碼)

            他:因為是筆試,我考慮的并不多,肯定能正確的運行。

            我:能正確的運行嗎?(我指著他代碼中的一處)

            他:我忘記了(汗一個,for循環(huán)連初始化都能忘記),不過在真正開發(fā)的時候不會這樣。

            我:就算能正確運行(還有些別的錯誤,我沒有和他糾纏了),那你感覺這段代碼,有哪些需要優(yōu)化的地方?

            他:……

            面試完后,同事說好囂張的面試者,說其囂張主要是神態(tài)和語氣。哎,第一次發(fā)現(xiàn)面試人員責(zé)問面試官的,更何況是被一個并不怎么樣的人。

            面試時請先準備一下

            有一個面試者,學(xué)歷挺高,成績也不錯,畢業(yè)也不是一年兩年了,說是想轉(zhuǎn)做Linux C開發(fā),筆試題做的不是很好。

            他說C語言是一門比較簡單的語言,能夠很快時間就能掌握。

            對于他的解釋,我沒有懷疑,也沒有過多的糾纏。畢竟,C的簡潔是眾所周知的。但是,既然說簡單,能夠很容易的掌握,為何不先準備,先掌握呢?

            機會永遠把握在有準備的人手中。與其說,不如進一步去做,掌握主動是面試不敗的真理。面試者看的不只是能力,還有態(tài)度。

            漂亮的代碼

            “什么是漂亮的代碼?”

            前一段時間,面試一個程序員的時候,他的目標是寫漂亮的代碼,我便問道這樣一個問題。對方的回答是“看起來比較舒服的代碼”,我沒有細究。

            做軟件開發(fā)工作也有四年的時間了,雖然也做產(chǎn)品分析等工作,但大部分時間都是一線的設(shè)計和編碼工作。編寫優(yōu)秀的代碼,也算是一個個人追求了。代碼常用的修飾語很多,漂亮的代碼、高效的代碼、穩(wěn)定的代碼等從多個方面對代碼進行形容。那什么樣的代碼才是優(yōu)秀卓越的代碼,這是一個我和面試者都要思考的問題。

            posted @ 2009-06-23 10:20 小夜 閱讀(416) | 評論 (0)編輯 收藏

            2009年6月18日

            查看linux系統(tǒng)性能的時候,會涉及到一個參數(shù)loadavg。那loadavg確切的含義是什么呢?
            文章來源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169030.aspx

            posted @ 2009-06-18 14:40 小夜 閱讀(285) | 評論 (0)編輯 收藏

            linux系統(tǒng)中的兩個命令,今天寫了個腳本,比較當前時間和文件中最后修改時間,用到了兩個命令,mark一下。 兩個命令中都有一系列format選項,date用的較多,使用“+”接format選項即可,在腳本中使用date +%s獲取當前時間(1970年到現(xiàn)在的秒數(shù))。stat命令用的較少,man了一下,又baidu了一番,最后細看了有看,試了又試,才發(fā)現(xiàn)stat有個開關(guān)“-c --format=FORMAT use the specified FORMAT instead of the default”。腳本中使用該開關(guān)得到文件的最后修改時間,命令為“stat -c %Y ${filename}”。 在linux這種開放的系統(tǒng)中,命令行參數(shù)是有很多風(fēng)格的,使用時要拋開慣性,細看手冊。
            文章來源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169102.aspx

            posted @ 2009-06-18 14:40 小夜 閱讀(332) | 評論 (0)編輯 收藏

            前兩天看libsmi源代碼,里面對strncpy函數(shù)進行了封裝,感覺有些缺陷,雖然內(nèi)部使用的函數(shù),滿足要求就可以了,但想了想發(fā)現(xiàn)自己它了解的也不是很多。 關(guān)于strncpy,《C程序設(shè)計語言》中是這樣介紹的:“char *strncpy(s, ct, n),strncpy用于把字符串ct中最多n個字符拷貝到字符串s中,并返回s。如果ct中少于n個字符,那么就用’\0’補充。” 寫了一個簡單的程序?qū)trncpy進行測試。
            文章來源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4167919.aspx

            posted @ 2009-06-18 14:38 小夜 閱讀(514) | 評論 (0)編輯 收藏

            看開源的代碼中發(fā)現(xiàn)了一些靜態(tài)函數(shù)聲明后有如下內(nèi)容:__attribute__ ((constructor))這是gcc的擴展屬性。
            文章來源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169081.aspx

            posted @ 2009-06-18 14:38 小夜 閱讀(210) | 評論 (0)編輯 收藏

            中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久综合狠狠综合久久| 精品久久久久久国产牛牛app| 久久ZYZ资源站无码中文动漫| 久久不见久久见免费视频7| 亚洲综合日韩久久成人AV| 18禁黄久久久AAA片| 久久亚洲AV无码精品色午夜 | 久久精品国产一区| 久久国产高潮流白浆免费观看| 久久精品欧美日韩精品| 久久99精品综合国产首页| 麻豆精品久久精品色综合| 久久久91精品国产一区二区三区 | 精品少妇人妻av无码久久| 粉嫩小泬无遮挡久久久久久| 成人久久久观看免费毛片| 99久久综合狠狠综合久久| 久久精品国产一区二区| 狠狠综合久久AV一区二区三区| 久久久久久久亚洲Av无码| 久久91精品久久91综合| 热综合一本伊人久久精品| 婷婷五月深深久久精品| 久久精品国产99国产精品澳门| 亚洲国产成人久久综合碰碰动漫3d | 97久久天天综合色天天综合色hd | 久久久免费观成人影院| 久久精品国产久精国产一老狼| 国产精品美女久久久久久2018| 国产精品久久久天天影视香蕉| 伊人久久大香线蕉综合影院首页| 久久精品一本到99热免费| 少妇久久久久久被弄到高潮 | 思思久久精品在热线热| …久久精品99久久香蕉国产| 久久激情五月丁香伊人| 精品国产乱码久久久久久郑州公司 | 99久久人妻无码精品系列 | 亚洲精品美女久久久久99| 久久99精品国产麻豆不卡|