2014-03-01

Python面向对象

创建类

class ClassName:
    '类的帮助信息'   #类文档字符串
    class_suite  #类体

实例

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
    '所有员工的基类'
    empCount = 0

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1

    def displayCount(self):
        print "Total Employee %d" % Employee.empCount

    def displayEmployee(self):
        print "Name : ", self.name,  ", Salary: ", self.salary

创建实例对象

"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)

访问属性

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

Python内置类属性

  • dict : 类的属性(包含一个字典,由类的数据属性组成)
  • doc :类的文档字符串
  • name: 类名
  • module: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
  • bases : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

Python类继承

  • 1:在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
  • 2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
  • 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

语法

class SubClassName (ParentClass1[, ParentClass2, ...]):
    'Optional class documentation string'
    class_suite

实例

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:        # 定义父类
    parentAttr = 100
    def __init__(self):
        print "调用父类构造函数"

    def parentMethod(self):
        print '调用父类方法'

    def setAttr(self, attr):
        Parent.parentAttr = attr

    def getAttr(self):
        print "父类属性 :", Parent.parentAttr

class Child(Parent): # 定义子类
    def __init__(self):
        print "调用子类构造方法"

    def childMethod(self):
        print '调用子类方法 child method'

c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法
c.getAttr()          # 再次调用父类的方法

类的属性与方法

  • 类的私有属性 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
  • 类的方法 在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数
  • 类的私有方法 __private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

Python正则表达式

re.match函数

函数语法

re.match(pattern, string, flags=0)

参数	描述
pattern	匹配的正则表达式
string	要匹配的字符串
flags	标志位用于控制正则表达式的匹配方式是否区分大小写多行匹配等等

匹配成功re.match方法返回一个匹配的对象,否则返回None。

匹配对象方法	描述
group(num=0)	匹配的整个表达式的字符串group() 可以一次输入多个组号在这种情况下它将返回一个包含那些组所对应值的元组
groups()	返回一个包含所有小组字符串的元组 1  所含的小组号

实例1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

实例2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
    print "matchObj.group() : ", matchObj.group()
    print "matchObj.group(1) : ", matchObj.group(1)
    print "matchObj.group(2) : ", matchObj.group(2)
else:
    print "No match!!"

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

re.search(pattern, string, flags=0)

参数	描述
pattern	匹配的正则表达式
string	要匹配的字符串
flags	标志位用于控制正则表达式的匹配方式是否区分大小写多行匹配等等

匹配对象方法	描述
group(num=0)	匹配的整个表达式的字符串group() 可以一次输入多个组号在这种情况下它将返回一个包含那些组所对应值的元组
groups()	返回一个包含所有小组字符串的元组 1  所含的小组号

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

检索和替换

返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。

re.sub(pattern, repl, string, max=0)

正则表达式修饰符 - 可选标志

修饰符	描述
re.I	使匹配对大小写不敏感
re.L	做本地化识别locale-aware匹配
re.M	多行匹配影响 ^  $
re.S	使 . 匹配包括换行在内的所有字符
re.U	根据Unicode字符集解析字符这个标志影响 \w, \W, \b, \B.
re.X	该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

正则表达式模式

模式	描述
^	匹配字符串的开头
$	匹配字符串的末尾
.	匹配任意字符除了换行符当re.DOTALL标记被指定时则可以匹配包括换行符的任意字符
[...]	用来表示一组字符,单独列出[amk] 匹配 'a''m''k'
[^...]	不在[]中的字符[^abc] 匹配除了a,b,c之外的字符
re*	匹配0个或多个的表达式
re+	匹配1个或多个的表达式
re?	匹配0个或1个由前面的正则表达式定义的片段非贪婪方式
re{ n}	
re{ n,}	精确匹配n个前面表达式
re{ n, m}	匹配 n  m 次由前面的正则表达式定义的片段贪婪方式
a| b	匹配a或b
(re)	G匹配括号内的表达式也表示一个组
(?imx)	正则表达式包含三种可选标志i, m,  x 只影响括号中的区域
(?-imx)	正则表达式关闭 i, m,  x 可选标志只影响括号中的区域
(?: re)	类似 (...), 但是不表示一个组
(?imx: re)	在括号中使用i, m,  x 可选标志
(?-imx: re)	在括号中不使用i, m,  x 可选标志
(?#...)	注释.
(?= re)	前向肯定界定符如果所含正则表达式 ... 表示在当前位置成功匹配时成功否则失败但一旦所含表达式已经尝试匹配引擎根本没有提高模式的剩余部分还要尝试界定符的右边
(?! re)	前向否定界定符与肯定界定符相反当所含表达式不能在字符串当前位置匹配时成功
(?> re)	匹配的独立模式省去回溯
\w	匹配字母数字
\W	匹配非字母数字
\s	匹配任意空白字符等价于 [\t\n\r\f].
\S	匹配任意非空字符
\d	匹配任意数字等价于 [0-9].
\D	匹配任意非数字
\A	匹配字符串开始
\Z	匹配字符串结束如果是存在换行只匹配到换行前的结束字符串c
\z	匹配字符串结束
\G	匹配最后匹配完成的位置
\b	匹配一个单词边界也就是指单词和空格间的位置例如 'er\b' 可以匹配"never" 中的 'er'但不能匹配 "verb" 中的 'er'
\B	匹配非单词边界'er\B' 能匹配 "verb" 中的 'er'但不能匹配 "never" 中的 'er'
\n, \t, .	匹配一个换行符匹配一个制表符
\1...\9	匹配第n个分组的子表达式
\10	匹配第n个分组的子表达式如果它经匹配否则指的是八进制字符码的表达式