其他相关
1、isinstance(obj,cls)
检查是否obj是类cls的对象
s= "123" print isinstance(n,int) # True print isinstance(s,int) # False print isinstance(s,str) # False
#针对类 class Foo: pass
obj= Foo() print isinstance(obj,Foo) # True
2、issubclass(sub,super)
检查sub类是否是super类的派生类
classFoo: pass class Fun(Foo): pass print issubclass(Fun,Foo) # True
3、异常处理
1:模式:
try:
# 正常的代码
pass
except Exception,e:
# 异常后显示的内容
pass
e是包含在Exception类中的一个对象,其中包含所有的报错的情况
实例:
whileTrue: num1 = raw_input('num1:') num2 = raw_input('num2:') try: num1 = int(num1) num2 = int(num2) result = num1 +num2 except Exception,e: print "报错信息如下显示:" print e '''
打印结果: num1:3 num2:f 报错信息如下显示: invalid literal for int() with base 10: 'f' '''
如果对程序的要求没有特殊的异常处理可以直接使用总的Exception,如果单独处理某种错误,可以按照下面的方法操作
try
:
li = [11,22,33,44]
li[110]
except IndexError,e:
print e
这样就只对索引的错误进行异常处理。
2:异常的种类
异常的种类有很多,每个异常专门用于处理某一项异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入
/
输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[
5
]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl
+
C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
|
异常其他结构
try
:
# 主代码块
pass
except KeyError,e:
# 异常时,执行该块
pass
else:
# 主代码块执行完执行该块
pass
finally:
# 无论是否异常,最终执行该块
pass
主动触发异常
try: N = raw_input("请输入1:") if N == 1: print "成功" else: raise Exception('我这里出错了。。。') except Exception,e: print "显示错误页面。。。。" print e 打印结果: 请输入1:2 显示错误页面。。。。 我这里出错了。。。
自定义触发异常
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
Alexerror(Exception):
def
__init__(
self
,msg
=
None
):
self
.message
=
msg
def
__str__(
self
):
if
self
.message:
return
self
.message
else
:
return
'Alex Error'
try
:
#raise Alexerror('报错了报错了')
raise
Alexerror()
except
Exception,e:
print
e
|
当类Alexerror加上括号执行的时候,是执行类中的构造函数__init__
Exception函数在返回的时候,是将__str__中的字符串返回出来。
如果使用Alexerror来执行的话,就返回Alex Error,在括号中加入内容的话,就返回其中的内容。
4、反射
普通方式实现:
首先在主程序中实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import
home
print
"oldboy 框架"
url
=
raw_input
(
"请输入URL:"
)
if
url
=
=
"home/func1"
:
ret
=
home.func1()
print
ret
elif
url
=
=
"home/func1"
:
ret
=
home.func1()
print
ret
elif
url
=
=
"home/func1"
:
ret
=
home.func1()
print
ret
elif
url
=
=
"home/func1"
:
ret
=
home.func1()
print
ret
else
:
print
"页面404错误"
|
调用的页面程序
1
2
3
4
5
6
7
8
9
10
|
#!/usr/bin/env python
# coding:utf-8
def
func1():
return
"result func1"
def
func2():
return
"result func2"
def
func3():
return
"result func3"
def
func4():
return
"result func4"
|
实现结果
1
2
3
4
5
6
|
oldboy 框架
请输入URL:rtew
页面
404
错误
oldboy 框架
请输入URL:home
/
func1
result func1
|
部分反射
1
2
3
4
5
6
7
8
9
10
11
12
|
import
home
print
"oldboy 框架"
url
=
raw_input
(
"请输入URL:"
)
controller,action
=
url.split(
'/'
)
func
=
getattr
(home,action)
ret
=
func()
print
ret
打印结果:
oldboy 框架
请输入URL:home
/
func1
result func1
|
action = 字符串
getattr:去某个容器模块中找函数,字符串函数名,如果有则获取函数。
以字符串的形式执行某一个模块中的函数
反射功能由以下四个内置函数提供:
hasattr getattr setattr delattr 这四个函数分别用于对对象内部执行:检查是否含有某个成员、获取成员、设置成员、删除成员。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# 操作内存中某个容器中的元素
# getattr setattr delattr hasattr
# 找到home文件将内容加载到内存
import
home
# 列出home中的所有内容
print
dir
(home)
print
hasattr
(home,
'func1'
)
print
hasattr
(home,
'2231241'
)
print
getattr
(home,
'func2'
)
setattr
(home,
'alex'
,
lambda
x:x
+
1
)
print
dir
(home)
delattr
(home,
'func3'
)
print
dir
(home)
class
foo:
static_name
=
'cgt'
def
__init__(
self
):
self
.name
=
'cgt'
def
show(
self
):
pass
@staticmethod
def
static_show():
pass
@classmethod
def
class_show(
cls
):
pass
print
foo.__dict__.keys()
print
hasattr
(foo,
'show'
)
obj
=
foo()
print
obj.__dict__
# 查看对象obj中有没有name元素,
print
hasattr
(obj,
'name'
)
print
hasattr
(obj,
'show'
)
打印结果:
[
'__builtins__'
,
'__doc__'
,
'__file__'
,
'__name__'
,
'__package__'
,
'func1'
,
'func2'
,
'func3'
,
'func4'
]
True
False
<function func2 at
0x021878F0
>
[
'__builtins__'
,
'__doc__'
,
'__file__'
,
'__name__'
,
'__package__'
,
'alex'
,
'func1'
,
'func2'
,
'func3'
,
'func4'
]
[
'__builtins__'
,
'__doc__'
,
'__file__'
,
'__name__'
,
'__package__'
,
'alex'
,
'func1'
,
'func2'
,
'func4'
]
[
'static_show'
,
'__module__'
,
'show'
,
'static_name'
,
'class_show'
,
'__doc__'
,
'__init__'
]
True
{
'name'
:
'cgt'
}
True
True
|
设计模式
1、单例,顾名思义单个实例。
比如在游戏的场景中,就无法使用单例模式,要不你怎么创建那么多角色。
实际应用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#!/usr/bin/env python
# coding:utf-8
class
SqlHelper:
__static_instance
=
None
def
__init__(
self
):
pass
@classmethod
def
instance(
cls
):
if
cls
.__static_instance:
return
cls
.__static_instance
else
:
cls
.__static_instance
=
SqlHelper()
return
cls
.__static_instance
def
fetch(
self
):
pass
def
remove(
self
):
pass
def
get_user():
obj
=
SqlHelper.instance()
obj.fetch()
print
id
(obj)
return
'1'
def
del_user():
obj
=
SqlHelper.instance()
obj.remove()
return
'1'
|
借助web来实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from
wsgiref.simple_server
import
make_server
def
RunServer(environ, start_response):
start_response(
'200 OK'
, [(
'Content-Type'
,
'text/html'
)])
url
=
environ[
'PATH_INFO'
]
# 对URL以/进行分割,
# temp = func3
filename
=
url.split(
'/'
)[
1
]
mothodname
=
url.split(
'/'
)[
2
]
# import home
module
=
__import__
(filename)
# 去home中检查,是否含有指定的函数
is_exist
=
hasattr
(module, mothodname)
if
is_exist:
# 获取函数
func
=
getattr
(module, mothodname)
# 执行t函数,并获取返回值
ret
=
func()
# 将函数返回值相应给请求者
return
ret
else
:
return
'404 not found'
if
__name__
=
=
'__main__'
:
httpd
=
make_server('',
8001
, RunServer)
print
"Serving HTTP on port 8001..."
httpd.serve_forever()
|
简单举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class
SqlHelper:
__static_instance
=
None
def
__init__(
self
):
self
.hostname
=
'0.0.0.0'
self
.port
=
3306
@classmethod
def
instance(
cls
):
if
cls
.__static_instance:
return
cls
.__static_instance
else
:
cls
.__static_instance
=
SqlHelper()
return
cls
.__static_instance
obj1
=
SqlHelper.instance()
print
id
(obj1)
obj2
=
SqlHelper.instance()
print
id
(obj2)
|