Python高级
python面向对象
简介
- 类
- 类变量
- 数据成员(类变量或者实例变量)
- 方法重写
- 局部变量
- 实例变量
- 继承
- 实例化
- 方法
- 对象
创建类
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
- empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问
- init()类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
- self 代表类的实例,相当于java的this,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数
创建对象
"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
访问属性
getattr(obj, name[, default]) : 访问对象的属性。
hasattr(obj,name) : 检查是否存在一个属性。
setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
delattr(obj, name) : 删除属性
python的内置属性
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
python的对象销毁
- 引用计数法(跟踪和回收垃圾)
- 注意:当对象被创建时,就创建了一个引用计数器,只有当该计数器为0时,该对象将被回收,but是等解释器在适当时机才将对象的内存空间回收,并不是立刻,这点跟java一样
- 循环垃圾收集器
- 指的两个对象互相引用,这个时候仅用引用计数法来回收是不能处理的,所以得用循环垃圾收集器
类的继承
-
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类
-
继承语法
class 派生类名(基类名)
...
class C(A, B): # 继承类 A 和 B
- 子类识别检测
- issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
- isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true
方法重写和重载
- 重写
- 如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
- 重载
序号 | 方法 | 描述 | 简单调用 |
---|
1 | init ( self [,args…] ) | 构造函数 | obj = className(args) |
2 | del( self ) | 析构方法, 删除一个对象 | del obj |
3 | repr( self ) | 转化为供解释器读取的形式 | repr(obj) |
4 | str( self ) | 用于将值转化为适于人阅读的形式 | str(obj) |
5 | cmp ( self, x ) | 对象比较 | cmp(obj, x) |
类的属性和方法
- 类的私有属性
- __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
- 类的方法
- 使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
- 类的私有方法
- __private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
class JustCounter:
__secretCount = 0 # 私有变量
publicCount = 0 # 公开变量
def count(self):
self.__secretCount += 1
self.publicCount += 1
print self.__secretCount
counter = JustCounter()
counter.count()
counter.count()
print counter.publicCount
print counter.__secretCount # 报错,实例不能访问私有变量
- 私有属性访问
- Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性
- 注意:.类名 是一根下划线
class Runoob:
__site = "www.runoob.com"
runoob = Runoob()
print runoob._Runoob__site
- 单下划线、双下划线、头尾双下划线说明:
- foo: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的
- _foo: 以单下划线开头的表示的是protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
- __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
python正则表达式
re.match函数
- re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
函数语法:
re.match(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,控制匹配方式,如:是否区分大小写,多行匹配等等。
re.search方法
- re.search 扫描整个字符串并返回第一个成功的匹配
函数语法:
re.search(pattern, string, flags=0)
正则实例
- 字符类
实例 | 描述 |
---|
[Pp]ython | 匹配 “Python” 或 “python” |
rub[ye] | 匹配 “ruby” 或 “rube” |
[aeiou] | 匹配中括号内的任意一个字母 |
[0-9 | 匹配任何数字。类似于 [0123456789] |
a-z] | 匹配任何小写字母 |
[A-Z] | 匹配任何大写字母 |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[^aeiou] | 除了aeiou字母以外的所有字符 |
[^0-9] | 匹配除了数字外的字符 |
- 特殊字符类
实例 | 描述 |
---|
. | 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 |
\W | 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。 |
- 其他特殊元素
实例 | 描述 |
---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。 |
re{ n,} | 匹配 n 个前面表达式 |