posts - 26, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2014年4月16日

最近专职做起了Python,得积累些Python的知识。
-----------------
阅读代码的时候,看到了classmethod。staticmethod用的挺多,classmethod一直没用过,感觉有些迷惑。
Google了一篇文章,讲的挺清楚:pyhton静态方法和类方法。上面这篇文章主要讲原理,我这里主要说说二者的相同和区别。
  1. 都可以通过类调用;
  2. 都可以通过对象调用;
  3. 都可以继承和复写;
  4. 都可以使用类属性、类方法和类的静态方法;
  5. 使用这些属性或方法时,staticmethod必须直接通过类名进行调用,classmethod可以优雅的通过参数cls调用。
在进行属性或方法调用时:staticmethod需要硬编码指明方法的类,如果存在继承,无法使用子类复写的方法和属性,比较适合用于对其他方法和属性不依赖或依赖较少的情况;classmethod通过cls进行调用,这个cls是调用时传入的类,可以是父类,也可以是子类,适合用于对其他方法和属性依赖较多的情况,也适用于需要通过集成扩展的情况。

下面的代码,简单试验了两者的区别,并通过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 小夜 阅读(376) | 评论 (0)编辑 收藏

2010年4月12日

工作中经常需要在正则表达式中使用方括号,比如匹配Linux系统命令行提示符“[root@localhost ~]# ”。在python中,可以使用正则表达式“[\[][^\[\]]*[\]][#|$] ”进行匹配,但在regex中此正则表达式无法正确匹配。
由于man手册中缺少对方括号转义的介绍,本文对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中左方括号需要转义,右方括号不需要转义。
下面我们再来测试匹配一下任意非方括号字符:
./testreg "[^\[]]+" //对[转义,不对]转义
[abc]
0001: [abc]
 $
0: c]
.
/testreg "[^\[\]]+" //对[和]转义
[abc]
0001: [abc]
 $
0: c]
.
/testreg "[^]\[]+" //对[转义,不对]转义,且把]放在^后使]不与前面的[匹配
[abc]
0001: [abc]
 $
0: abc
通过上面测试可以得出正确的正则表达式来匹配Linux命令行提示符——“[\[][^]\[]*[]][#$] ”或“\[[^]\[]*][#$] ”。

posted @ 2010-04-12 13:14 小夜 阅读(5483) | 评论 (0)编辑 收藏

2009年10月16日

     摘要: 1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: >>> help(dir)Help on built-in function dir in module __builtin__:dir()    dir([object])...  阅读全文

posted @ 2009-10-16 20:32 小夜 阅读(3055) | 评论 (0)编辑 收藏

2009年9月23日

就是很多库和工具还不支持,等库和工具都正常了,就转用它了。

posted @ 2009-09-23 19:58 小夜 阅读(153) | 评论 (0)编辑 收藏

2009年9月1日

 起因很简单,不小心为一个文件关联了默认打开方式,然后就eclipse中一打开该文件就出来个记事本,打开的时候只好使用右键,选择打开方式,颇为繁琐。

于是,百度之。看到的第一种方法是直接修改注册表,删除扩展名对应的注册项,结果以失败告终,用eclipse打开文件依然出来记事本,可能是修改的地方不对或不全。

找到第二种方法,终于解决问题,记录如下:打开Explorer,点击菜单“工具 | 文件夹选项”,点击“文件类型”,找到对应的扩展名后删除即可。

对于我遇到的这个问题,还可以通过修改eclipse解决:点击菜单“window | preferences”,进入“General | Editors | File Associations”,添加一个扩展名,然后设置一个默认打开方式即可。

posted @ 2009-09-01 15:56 小夜 阅读(304) | 评论 (0)编辑 收藏

2009年6月23日

面试中的趣味

林子大了,什么鸟都有。

面试是一件比较有意思的工作,能够接触形形色色的人。

嚣张的面试者

最近面试了一个比较嚣张的人,说是比较喜欢有挑战的工作,离职主要是由于工作没有挑战性。看其笔试,并不是特别显眼。

他:在项目中我是让测试者比较头疼的人,本来安排10天干完的活,3天就干完了,我就找他们测试,测试人员比较烦,总得提前进行测试工作。

我:一个项目总有一个项目的进度安排,测试和开发都如此。在多余的时间里,有没有考虑做些其他的事情?

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

我:没有考虑做一些代码质量优化类似的工作?

他:……

我:你感觉你这段代码写的怎么样?(我指着他笔试的代码)

他:因为是笔试,我考虑的并不多,肯定能正确的运行。

我:能正确的运行吗?(我指着他代码中的一处)

他:我忘记了(汗一个,for循环连初始化都能忘记),不过在真正开发的时候不会这样。

我:就算能正确运行(还有些别的错误,我没有和他纠缠了),那你感觉这段代码,有哪些需要优化的地方?

他:……

面试完后,同事说好嚣张的面试者,说其嚣张主要是神态和语气。哎,第一次发现面试人员责问面试官的,更何况是被一个并不怎么样的人。

面试时请先准备一下

有一个面试者,学历挺高,成绩也不错,毕业也不是一年两年了,说是想转做Linux C开发,笔试题做的不是很好。

他说C语言是一门比较简单的语言,能够很快时间就能掌握。

对于他的解释,我没有怀疑,也没有过多的纠缠。毕竟,C的简洁是众所周知的。但是,既然说简单,能够很容易的掌握,为何不先准备,先掌握呢?

机会永远把握在有准备的人手中。与其说,不如进一步去做,掌握主动是面试不败的真理。面试者看的不只是能力,还有态度。

漂亮的代码

“什么是漂亮的代码?”

前一段时间,面试一个程序员的时候,他的目标是写漂亮的代码,我便问道这样一个问题。对方的回答是“看起来比较舒服的代码”,我没有细究。

做软件开发工作也有四年的时间了,虽然也做产品分析等工作,但大部分时间都是一线的设计和编码工作。编写优秀的代码,也算是一个个人追求了。代码常用的修饰语很多,漂亮的代码、高效的代码、稳定的代码等从多个方面对代码进行形容。那什么样的代码才是优秀卓越的代码,这是一个我和面试者都要思考的问题。

posted @ 2009-06-23 10:20 小夜 阅读(384) | 评论 (0)编辑 收藏

2009年6月18日

linux系统中的两个命令,今天写了个脚本,比较当前时间和文件中最后修改时间,用到了两个命令,mark一下。 两个命令中都有一系列format选项,date用的较多,使用“+”接format选项即可,在脚本中使用date +%s获取当前时间(1970年到现在的秒数)。stat命令用的较少,man了一下,又baidu了一番,最后细看了有看,试了又试,才发现stat有个开关“-c --format=FORMAT use the specified FORMAT instead of the default”。脚本中使用该开关得到文件的最后修改时间,命令为“stat -c %Y ${filename}”。 在linux这种开放的系统中,命令行参数是有很多风格的,使用时要抛开惯性,细看手册。
文章来源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169102.aspx

posted @ 2009-06-18 14:40 小夜 阅读(301) | 评论 (0)编辑 收藏

查看linux系统性能的时候,会涉及到一个参数loadavg。那loadavg确切的含义是什么呢?
文章来源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169030.aspx

posted @ 2009-06-18 14:40 小夜 阅读(263) | 评论 (0)编辑 收藏

最近看CSDN,又谈到一道面试题,大致是“不使用比较运算符和库函数比较两个整数的大小”。这种题看似简单,实则深藏玄机,考得不只是技巧还有很多基础知识。
文章来源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169108.aspx

posted @ 2009-06-18 14:38 小夜 阅读(354) | 评论 (0)编辑 收藏

进程间通信知识了解不少,今天第一次正式使用,就出问题了。 看看共享内存的原理,操作系统把一块公共的内存区域,映射到进程内存空间中,但映射的内存地址并不能保证映射后的地址一致性(其实一致的可能性很小,基本没有成功过),而此处array执行的地址为创建共享内存进程中正确的数组地址,在新的进程中就不对了。 因此在共享内存中,需要慎重使用指针变量。对于本文中的问题修改很简单,删除int *array,每次使用结构的地址跳过这些额外信息即可,可通过下面的宏函数得到数据域的指针。
文章来源:http://blog.csdn.net/volant_hoo/archive/2009/05/11/4169093.aspx

posted @ 2009-06-18 14:38 小夜 阅读(340) | 评论 (0)编辑 收藏