Python-面向对像及其他

简介:

 

其他相关

1、isinstance(obj,cls)

      检查是否obj是类cls的对象

复制代码
 
# 针对变量 n = 123
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类的派生类

class
Foo: pass class Fun(Foo): pass print issubclass(Fun,Foo) # True

3、异常处理

1:模式: 
try
# 正常的代码 
    pass 
except 
Exception,e: 
    # 异常后显示的内容 
    
pass

e是包含在Exception类中的一个对象,其中包含所有的报错的情况

实例:

复制代码
 
while
True: 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)
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************
本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/5569993.html ,如需转载请自行联系原作者
相关文章
|
3月前
|
Python
Python懒羊羊
Python懒羊羊
44 0
|
2月前
|
Python
python作业题
python作业题
|
11月前
|
Python
Python樱花树
粉色系最爱!Python樱花树等你获取~ 哈喽小伙伴们好久不见啦,最近樱花开得好美吖,博主想和大家一起分享春天的快乐,一起来看看博主画的樱花树吧!
67 0
|
Shell Python
初识python之技巧总结篇
初识python之技巧总结篇
104 0
初识python之技巧总结篇
|
JSON NoSQL MongoDB
每天一个Python小技巧(3)
每天一个Python小技巧(3)
121 0
每天一个Python小技巧(3)
|
安全 Python
每天一个Python小技巧(5)
每天一个Python小技巧(5)
|
Python
python练习
python练习
140 0
python练习
|
Python
Python 小技之繁花盛开
Python 小技之繁花盛开
138 0
Python 小技之繁花盛开
|
运维 Java 程序员
为什么很多人都说 Python 简单?
python写业务是简单,学深了不容易。
141 0