python多个装饰器的先后顺序

当一个函数被多个装饰器装饰时,会从离函数最近的装饰器开始对函数进行装饰,离函数最远的装饰器最后装饰,越近的装饰器会在最终的函数的内层,越远的越会在函数的外层,所以最外层装饰器中的代码最先执行,最内层的装饰器的代码最后执行。 #!/usr/bin/env python3 def dec1(f): print("dec1, before") def dec(): print("dec1") f() return dec def dec2(f): print("dec2, before") def dec(): print("dec2") f() return dec def dec3(f): print("dec3, before") def dec(): print("dec3") f() return dec @dec3 @dec1 @dec2 def printf(): print("real function") printf() 这段代码将会输出 dec2, before dec1, before dec3, before dec3 dec1 dec2 real function…

TCP粘包处理

[Docs] [txt|pdf] [Tracker] [Email] [Nits] Versions: 00 INTERNET-DRAFT C. Sapuntzakis Cisco Systems <draft-csapuntz-tcpmsgbnd-00.txtAugust 2000 Expires February 2001 TCP Message Boundary Option Status of this Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of RFC2026. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents…

python中类与类型的统一是指什么

世间具有共同特性的东西,我们可以将其归为一类,为它起个名字,叫吃的,喝的。。。但他们并不是具体的事物,而是抽象的名词。python中的类型(type)和对象(object)同样是抽象名词,type用来描述object具有哪些共同的属性,比如说苹果(object),香蕉(object),他们都能吃,可以把他们归为”吃的”类(type),能吃是它们的一个属性,当然他们还有其他属性,也可根据其他属性归类。 python中的每个object都具有一个class属性,他的值是一个type类型的实例,是一个实际对象,这个实力描述了这个类型的名称,属性和有哪些方法,比如说怎么吃,包皮吃还是直接吃。一只猪和一只狗是两个实际的object,它们是动物,那就让他们的class指向动物类型(type)的一个实例。每个type实例都有一个base属性,这是指继承于上一级的属性,比如动物和人,人是动物的一个子类,动物都有吃的属性,但人具有说话的属性。对于动物和人有两个类(type),animal和human,在ainimal中有吃的属性,在human中有说话的属性,当实例化一个human时,我们要调用吃的方法,会在human中定义查找这个方法,没有找到,那么就看看human.base中有哪些类,找到了动物,在animal的定义中找到了吃的属性,那么就调用这个属性。 值得我们记住的就是在python中所有的东西都是对象,他们都继承自object,既然都是对象,那么他们就都具有type属性(class)。object也不例外,它的class就是type。如果object是一头猪,那么class可能就是一个type的实例————动物。type也是一个对象,它的class就是type。 其实可以这样简单理解,我们所定义类型(class)或系统内建的类型(class)都是type的实例,我们用到的实例化后得到的东西是type的实例的实例,并且这些class都继承于class object。 这是我的个人理解,如有不对之处欢迎指出。…

python中的类属性和实例属性

python中的实例属性指和每个实际实例相关的属性,当类A继承自B时,a = A()读取a.data,会首先在a.dict中查找data,也就是实例中查找data属性,dict其实就是存储实例属性的地方。当在a中查找到时(也就是在dict中),返回该指,如果data属性不在a中,那么会查找类及父类中的该属性。当对a.data赋值时,由于python动态绑定(或者其他原因),就直接在a的dict中赋值,比如append方法。 不管是类A,类B还是A的实例a或者B的实例b,在python眼中,它们都是实例,需要有位置存放与这些实例相关的数据,这正是dict的作用,此外除了dict外,在内部可能还会有个code属性,用来查找代码的位置等。另外,python看待类A和类B是完全一样的,它们都是同一个类型,继承关系只是规定了python在访问对象实例(python眼中的)的属性时,需要去哪里找而已。 以上是我个人观点,不代表正确,欢迎大家指正。…

PHP通过魔术方法实现多继承与重载

 PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。我们是通过魔术方法(magic methods)来实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。本节后面将使用”不可访问属性”和”不可访问方法”来称呼这些未定义或不可见的类属性或方法。所有的重载方法都必须被声明为 public。 <?php class Parent1 { public function printFunction ($args) { echo 'parent1->printfunction ' . $args . '<br>'; } public function printFunction1 ($args) { echo 'parent1->printfunction1 ' . $args . '<br>'; } } class Parent2 { public function printFunction2 ($args) { echo 'parent2->printfunction2 ' . $args . '<br>'; } } class Child { protected $_parents = null; public function __construct($parents) { $this->_parents = $parents; } public function __call($method, $args)…

PHP中的引用详解

我们首先看下官方英文文档的解释。 PHP中的引用意味着你可以用不同的变量名访问同一个变量内容。在PHP中变量名和变量内容是不同的,引用是符号表别名。引用不同于C语言中的指针,你不能对其进行数学运算。最形象的比喻就是Unix的文件系统,变量名对应文件系统中的文件名,而变量内容对应文件系统中实际的文件内容,引用即为系统中的硬链接。 那么PHP中的引用和C语言中的指针有什么不同呢?C语言中加入定义一个整形指针“int *p”,我们可以对指针进行加操作“p++”,那么它就指向了下一个内存地址。或者我们进行赋值操作,给指针p一个新的地址“p = n”,那么p就指向了n所指向的地址,他们都指向同一个地址。而在PHP中我们不可以对引用使用加减操作,因为通过引用赋值时,如“$b=&$a”,新的$b只是一个变量名而已,和$a是一样的,&的作用就是使$b的变量内容指向了$a的变量内容,$b终究只是一个变量名,用官方的说法是$a的别名。说的直白点就是,使用了“&”的话就不会分配新的内存空间,引用的结果是新变量指向现有的内存空间。 PHP中引用的作用是什么呢?引用有三个基本的作用:引用赋值、引用传递和引用返回。 引用赋值 对于“$a=$b”,$a和$b是完全一样的,他们都指向同一个内容。 引用传递 PHP中函数参数的传递都是值传递,都是将实参的值拷贝一份传递到函数中。如果想在函数中修改函数外部的值,那么就需要引用。 引用返回 可以使用引用进行函数返回,而不是返回值的拷贝。 具体的作用介绍可参考http://php.net/manual/en/language.references.whatdo.php。 需要我们注意的是,在PHP5中的对象变量,我们需要深刻理解。PHP5中的对象变量已经不再保存整个对象的值,只是保存一个标识符来访问真正的对象内容。当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。 可以参考下列代码对本篇文章进行理解。 <?php $a = 1; $b = $a; $b = 4; echo $a . '<br>'; // 1 $b = &$a; $b = 4; echo $a . '<br>'; // 4 $c = $b; $c = 5; echo $b . '<br>'; // 4 echo $a . '<br><br>'; // 4 $a= 1; function func (&$args){ $args = 6;…

4. Posix基本正则表达式

Posix基本正则表达式可实现不同的工具之间保持一致性,例如grep和awk。对于传统的unix工具,并没有实现扩展正则表达式。 历史 传统的unix正则表达式语法在各个工具之间都不同,posix正则表达式被ieee开发,它还具有一套宽展语法。这些标准的设计考虑到尽可能兼容简单正则表达式语法,并为unix工具提供一套标准的语法。 语法 在posix基本正则表达式语法中,大多数字符都被理解为字面意思,它们只匹配它们自己。除此之外为元字符,元字符的定义如下表。 元字符 描述 . 匹配任何单一字符(许多应用程序不对换行符进行匹配,因为换行符根据字符编码和平台相关,但是假设总是匹配换行符是安全的),在posix括号表达式“[]”中,“.”字符总是匹配本身,例如[a.c]匹配“a”、“.”或“c”。 [ ] 匹配括号中的单一字符,例如[abc]匹配“a”、“b”或“c”,[a-z]表示匹配小写字母a到小写字母 z的一个范围。这种形式可以混合使用,如[abcx-z]表示匹配”a”、“b”、“c”、“x”、“y”和”z”,[a-cx-z]具有同样效果。如果“-”是括号中的第一个或者最后一个字符,那么它将理解为字面含义“-”。“]”字符可以出现在括号表达式中,如果他是第一个字符的话,例如“[]abc]”。括号表达式中也可包含”字符类”,“等价类”和”整理字符”。 [^ ] 匹配除了括号中的任一字符,结构和用法同“[]”。 ^ 如果是正则表达式的第一个字符,将匹配字符串的起始位置。 $ 如果是正则表达式的最后一个字符,将在字符串的结尾处进行匹配 * 匹配前一个匹配元素0次或多次,如“ab*c”将匹配”ac”,“abc”和“abbbc”等。“[xyz]*”匹配“”,“x”,”y”,“z”,“zx”,“zyx”,“xyzzy”等。 BRE: \{m\} ERE: {m} 指定前一个匹配元素的匹配次数,如”a\{3\}”仅匹配“aaa”。 BRE: \{m,\} ERE: {m,} 匹配前一个匹配元素最少m次,例如“a\{3,\}”匹配“aaa”,“aaaa”,”aaaaa”等。 BRE: \{m,n\} ERE: {m,n} 匹配前一个匹配元素最少m次,最多n次,例如“a\{3,5\}”匹配“aaa”,”aaaa”,“aaaaa”。 BRE: \( \) ERE: ( ) 定义一个子表达式,将对待该元素为单一元素,例如“ab*”匹配“a”,“ab”,“abb”等。而“\(ab\)*”匹配”“,”abab”,”ababab“等。被匹配的字符串稍后可以被调用,请参考”\n“。 BRE only: \n 取得第n个子表达式的值,n为1到9。This construct is theoretically irregular (an expression with this construct does not obey the mathematical definition of regular expression), and was not adopted…

3. Perl兼容正则表达式

Perl具有比POSIX扩展正则表达式语法更丰富,更可预测的语法。其可预测性的一个例子是,\总是引用一个非字母数字字符。采用perl,我们可以描述是否启用贪婪模式,而posix却不能,例如/a.b/模式,其中的.将尽可能匹配更多,而在/a.?b/模式中,其中的.?将尽可能的匹配更少的字符。所以,对于这个字符串“a bad dab”,采用前一种模式时将匹配整个字符,第二种将匹配“a b”。 处于这些原因,其他的工具和程序都采用类似perl的语法。例如Java 、Ruby、Python、PHP、exim、BBEdit,甚至是微软的.net都采用类似perl的语法。然而,并非所有的perl兼容模式的语法的实现都是一样的,许多实现仅是perl的一个子集。 在实施例中使用的约定:字符’m’不总是需要指定一个perl匹配操作。例如,m/[^ ABC]/也可以呈现为/[^ ABC]/。如果用户希望指定的匹配操作,而无需使用一个正斜杠作为正则表达式定界符的’m’为唯一必要的。有时为了避免“撞分隔符”指定替代正则表达式的分隔符是有用的。见perldoc perlre了解更多详情。 元字符 描述 示例 所有的if表达式返回真值 . 匹配除了换行符之外的任意单一字符,如果在方括号中,则为字面意思,匹配“.”自身 if ("Hello World\n" =~ m/...../) { print "Yep"; # Has length >= 5\n"; } ( ) 将要匹配的模式放在括号中,在以后我们可以通过使用$1、$2等来访问这些匹配到的元素。 if ("Hello World\n" =~ m/(H..).(o..)/) { print "We matched '$1' and '$2'\n"; } Output: We matched 'Hel' and 'o W'; + 匹配前一个元素一次或多次 if ("Hello World\n" =~ m/l+/) { print "One or more \"l\"'s in the string\n"; }…

2. 基本正则表达式

对于基本正则表达式,当反斜线位于某些元字符前面时,不同的实现的,对反斜线的处理方式不同。例如,egrep和perl对待未加反斜线的括号和竖线(|)为元字符,保留加反斜线的版本为字符本身。老版本的grep不支持管道操作符。 操作符 操作符 效果 . “.”匹配任何单一字符 [ ] 匹配字符列表或字符范围 [^ ] 匹配不在此列表或范围内的字符 * 匹配0个或更多个字符 ^ 匹配行开始处 $ 匹配行结束处 示例 示例 匹配 “.at” 任何三个字符的字符串,像hat、cat或bat “[hc]at” hat和cat “[^b]at” 同“.bat”类似,但不包含“bat” “^[hc]at” 在行开始处匹配hat或cat “[hc]at$” 在行结束处匹配hat或cat 使用基本正则表达式的工具有:TBD。…

1. 简单正则表达式

由于考虑到兼容性的原因,在类unix系统中,简单的正则表达式仍广泛使用。大多数支持正则表达式的命令,如grep和sed等默认使用简单正则表达式,但同时支持扩展正则表达式,需通过命令行参数指定。在posix兼容系统上,简单正则表达式已经废弃,因此新的命令或工具请不要使用此语法。 当使用简单正则表达式时,除了元字符,大多数字符将按照字面意思处理,它们只匹配它们自己,例如‘a’只匹配‘a’,‘bc’只匹配‘bc’。 操作符 操作符 效果 . 点操作符匹配任何单一字符 [ ] 匹配字符列表或字符范围 [^ ] 匹配不在此范围或列表中的字符 ^ 匹配行开始处 (or any line, when applied in multiline mode) $ 匹配行结束处 (or any line, when applied in multiline mode) ( ) 括号定义了一个标记,匹配的部分在此后返回 \n 其中n是从1到9的数字;内容相匹配的第n个标记子表达式匹配。在扩展的正则表达式语法中这种不规则的结构并没有被采纳。 * *跟在单字符表达式后表示匹配0次或多次,如 “ab*c”匹配”ac”, “abc”, “abbbc”等。 “[xyz]*” 匹配””, “x”, “y”, “zx”, “zyx”等. \n*, where n is a digit from 1 to 9, matches zero or more iterations of what the nth marked subexpression…