一、反射
在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
Python同样具有反射机制,使用反射获取到的函数和方法可以像平常一样加上括号直接调用,获取到类后可以直接构造实例;不过获取到的字段不能直接赋值,因为拿到的其实是另一个指向同一个地方的引用,赋值只能改变当前的这个引用而已。
反射机制的实现依赖一下几个内置函数:
hasattr(object, attr):判断object中是否存在attr属性或方法,存在则返回True,否则返回False
getattr(object,attr,default):如果存在attr属性(方法)则返回attr的值(方法地址)否则返回default值。
setattr():对容器中以参数为名称的内容进行修改
delattr():删除容器中以参数为名称的内容
例如下:定义一个Dog类并实例化,判断用户输入的内容是否是Dog中的方法,如果是执行该方法,如果不是,则添加为该对象的方法
1 def bark(self): 2 print('%s bark loudly'%self.name) 3 4 def sleep(self): 5 print('%s is sleeping'%self.name) 6 7 8 class Dog(object): 9 def __init__(self,name): 10 self.name = name 11 def eat(self): 12 print('%s is eating'%self.name) 13 14 d = Dog('bobo') 15 choice = input('>>:').strip() 16 17 if hasattr(d,choice): 18 19 func = getattr(d,choice) 20 func() 21 22 else: 23 setattr(d,choice,sleep) 24 func = getattr(d, choice) 25 func(d)
输入已存在的方法
>>:eat bobo is eating
输入不存在的方法
>>:sleepy bobo is sleeping
如果要判断对象中是否存在某属性,方法与上面相同
1 class Dog(object): 2 def __init__(self,name): 3 self.name = name 4 def eat(self): 5 print('%s is eating'%self.name) 6 7 d = Dog('poppy') 8 9 choice = input('>>:').strip() 10 11 if hasattr(d,choice): 12 attr = getattr(d,choice) 13 print(attr) 14 else: 15 setattr(d, choice, '8') 16 new_attr = getattr(d,choice) 17 print(new_attr)
输入已经存在的属性则打印出该属性值
>>:name
poppy
输入不存在的属性值,则为对象添加该属性,并赋值为8
>>:age
8
二、网络编程
Python 提供了两个基本的 socket 模块。
第一个是 Socket,它提供了标准的 BSD Sockets API。
第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接 字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
例客户端程序:
1 import socket 2 client = socket.socket()#声明socket 类型,同时生成socket连接对象 3 client.connect(('localhost',6969)) 4 while True: 5 msg = input('>>>:').strip()#不可以send空值 6 #client.send(b'你好jim'.encode('utf_8')) # py3 中只能发送字节 7 if len(msg) == 0: 8 continue 9 client.send(msg.encode('utf_8')) 10 data = client.recv(1024) 11 print('received :', data) 12 client.close()
服务器端程序:
1 import socket 2 3 server = socket.socket() 4 server.bind(('localhost',6969))#绑定要监听的端口 5 server.listen(5)#最大允许排队数 6 print('start to wait!') 7 while True: 8 # conn就是客户端连过来而在服务器端为其生成的一个连接实例 9 conn, addr = server.accept() # 等待 10 11 print(conn, addr) 12 13 print('phone comed!') 14 while True: 15 data = conn.recv(1024) 16 17 print('recv:', data) 18 19 conn.send(data.upper()) 20 21 server.close()