面向对象扩展
1、isinstance(obj, cls), issubclass(sub, super)示例
class A(object):
def a(self):
print "A"
class B(A): #B继承A
def b(self):
print "B"
t = B()
print isinstance(t, A) #判断t是否为A的实例对象
print isinstance(t, B) #判断t是否为B的实例对象
print issubclass(B, A) #判断B是否为A的派生类
2、异常处理
异常的完整结构
try:
pass #主代码块在这里执行
except:
pass #出现异常时,执行此处语句
else:
pass #主代码块执行完毕之后,执行此处语句
finally:
pass #不管是否有异常,最终都会输出结果
自定义异常
"""__str__方法"""
class MyError(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message
try:
#"http error"是传入的message信息,产生异常时会调用__str__方法,并返回传入的 # http error
raise MyError("http error")
except Exception, e:
print e
3、反射
"""第一种方法:反射(针对海量页面,根据URL的不同返回不同的页面)"""
print "Welcome, My Web"
url = raw_input("http://")
controller, action = url.split("/")
func = getattr(home, action)
ret = func()
print ret
"""第二种方法,匹配每个不同的URL,返回不同的页面"""
print "Welcome, My Web"
url = raw_input("http://")
if url == "home/home":
print home.home()
elif url == "home/page":
print home.page()
elif url == "home/row":
print home.row()
else:
print "wrong url"
getattr, setattr, hasattr, delattr
print dir(home)
print hasattr(home, "home")
setattr(home, "liyang", "gentle men")
print dir(home)
delattr(home, "liyang")
delattr(home, "row")
print dir(home)
结果:
['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'home', 'page', 'row']
True
['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'home', 'liyang', 'page', 'row']
['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'home', 'page']
"""反射三,动态导入模块"""
controller, action = raw_input("http://").split("/")
#将模块以字符串的形式导入,输入home/home,得到返回值home
module = __import__(controller)
func = getattr(module, action)
ret = func()
print ret
结果:
http://home/home
home
4、Socket编程
"""socket-server"""
def main():
# 创建socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
# 监听端口, 地址以元组的形式表现
sock.bind(('127.0.0.1', 8001))
# 开始监听,5表示队列中可以保存的,未被服务器端所处理的连接
sock.listen(5)
while True:
# 阻塞,deng 。。。。
# 直到有请求连接
print '....'
connection, address = sock.accept()
# connection,代表客户端socket对象,
# address,客户端IP地址
#handle_request(connection)
#接受客户端传来的信息
buf = connection.recv(1024)
print buf
connection.send("HTTP/1.1 200 OK\r\n\r\n")
connection.send("Hello, World")
connection.close()
if __name__ == '__main__':
main()
""""socket-client:"""
import socket
__author__ = 'LiYang'
#创建socket对象
obj_client = socket.socket()
#客户端连接服务器端的地址
obj_client.connect(("localhost", 8021))
#客户端向服务器端发送的数据
obj_client.send("client")
#客户端接受服务器端的返回值,并输出
server_data = obj_client.recv(1024)
print server_data
#关闭客户端连接
obj_client.close()
5、设计模式----单例模式
单例模式,顾名思义就是只有一个实例的模式,避免内存浪费
"""""""""""单例类定义 """"""""""""
class SqlHelper(object):
__instance = None #声明类的私有静态字段
def __init__(self):
self.hostname = '0.0.0.0'
self.port = 3306
self.password = '123'
self.username = 'root'
@classmethod
def singleton(cls):
if cls.__instance: #实例存在,直接返回
return cls.__instance
else:
cls.__instance = SqlHelper() #实例不存在,此处执行实例化,并返回
return cls.__instance
#验证一
print id(SqlHelper())
print id(SqlHelper())
print id(SqlHelper())
结果(返回相同的内存地址):
34354400
34354400
34354400
#验证二
obj1 = SqlHelper.singleton()
obj2 = SqlHelper.singleton()
print id(obj1)
print id(obj2)
结果(返回相同的内存地址):
33693256
33693256
Python网络编程
在Unix/Linux的世界中,socket套接字是实现应用程序间网络通信的方式,socket套接字指的是IP地址和端口号一组描述。
"""server-socket"""
服务器端,socket的创建顺序是:
创建socket套接字---->绑定IP地址和端口----->服务器启动监听---->服务器阻塞直到客户端的连接请求---->接受客户端的数据---->关闭socket连接
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Writed by liyang
import os
import SocketServer
import socket
__author__ = 'LiYang'
class MyServer(SocketServer.BaseRequestHandler):
def handle(self):
"""显示客户端的连接地址"""
print "Got connection from ", self.client_address
while True:
"""接收客户端输入的命令,并显示命令"""
data = self.request.recv(1024)
print "Receive cmd from client: %s" % data
"""执行命令,并将返回值复制给cmd_result"""
cmd_result = os.popen(data).read()
"""显示返回结果的大小,并发送给客户端"""
print "The size of cmd_result: ", len(cmd_result)
self.request.sendall(str(len(cmd_result)))
"""发送给客户端命令的返回结果"""
self.request.sendall(cmd_result)
if __name__ == '__main__':
server = SocketServer.ThreadingTCPServer(('127.0.0.1', 8000), MyServer)
server.serve_forever()
"""client-socket"""
客户端,socket的创建顺序是:
创建socket套接字---->连接服务器端的地址---->向客户端发送数据---->得到服务器端返回的数据---->关闭socket连接
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Writed by liyang
import SocketServer
import socket
__author__ = 'LiYang'
"""服务器端地址和端口"""
ip_port = ('127.0.0.1',8000)
"""创建套接字"""
sk = socket.socket()
"""连接服务器"""
sk.connect(ip_port)
"""设置超时时间"""
sk.settimeout(5)
while True:
"""输入要执行的命令"""
inp = raw_input('please input:')
sk.sendall(inp)
"""接收服务器传来的结果的大小"""
result_size = sk.recv(1024)
print "The size of data going to receive: ", result_size
total_size = int(result_size)
received_size = 0
while True:
data = sk.recv(1024)
received_size += len(data)
print "--data having--"
if total_size == received_size:
print data
print "--no data--"
break
print data
sk.close()
以上客户端和服务器端之间通过socket套接字,实现了在客户端上输入命令并返回服务器端的命令的执行结果。
总结
网络编程首先认识的socket套接字,socket是实现应用程序网络通信的必要技术,SocketServer模块则实现了服务器端的并发请求的处理。
Python学习渐渐进入了一个复杂有令人兴奋的阶段,感谢老师得辛苦讲解,我会边学习边复习,努力掌握每个重要的知识点。