目录:

  • 面向对象
  • 反射
  • socket

一、面向对象

方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
静态方法:由类调用;无默认参数;

class Aniaml:
count = 10
def __init__(self,name):
self.name = name
self.num = None
hobbie = 'meat'
@classmethod #类方法,不能访问实例变量
def talk(self):
print('%s is talking ...'%self.hobbie )
@staticmethod #静态方法,不能访问类变量及实例变量
def walk():
print('is walking ...')
@property #把方法变属性
def habbit(self):
print('%s habit is sss'%self.name)
@property
def total_players(self):
return self.num
@total_players.setter
def total_players(self,num):
self.num = num
print('total players:',self.num)
@total_players.deleter
def total_players(self):
print('total player got deleted.')
del self.num
Aniaml.hobbie
Aniaml.talk() d = Aniaml('hahah')
print(d.total_players)
d.total_players = 3
类的特殊成员,内部模块 class A:
n = 'A'
def f2(self):
print('f2 from A')
class B(A): n = 'B'
def __init__(self):
pass
def f1(self):
print('f1 from B')
def f2(self):
print('f2 from B')
def __del__(self):
print('del ....')
def __call__(self, *args, **kwargs):
print('__cal__')
class C(A):
n = 'C'
def f2(self):
print('f2 from C')
class D(B,C):
pass
d = D()
d.f1()
d.f2()
print(B.__doc__)
print(B.__dict__)
print(B.__class__)
print(B.__module__)
B.__del__
obj = B()
obj()

二、反射

Python中的反射功能由以下四个内置函数提供:

  • hasattr()    检查是否包含某成员
  • getattr()    获取成员
  • setattr()    设置成员
  • delattr()    删除成员

1、从前我们最开始在写一些输入选项的时候会使用简单的if … else..来实现:

 raw = input(‘输入您的选择:’).strip()
if raw == ‘start’:
pass
else raw == ‘stop’:
pass

2、后来学习了字典以后,我们发现原来可以精简一些:

menu_dic = {'':'start’,'2':'stop','3':'restart'}
raw = input('请输入您的选择: ').strip()
if raw in menu_dic:
print(menu_dic[raw])

3、再后来学习了反射后,我们发现原来还可以再精简一些:

import sys
class WebServer(object):
def __init__(self,host,port):
self.host = host
self.port = port
def start(self):
print('Server is stating ...')
def stop(self):
print('Server is stopping ...')
def restart(self):
self.stop()
self.start()
print('Server is restarting ...')
if __name__ == '__main__':
server = WebServer('localhost',80)
#hasatter 判断输入参数是否包含在class WebServer()
if hasattr(server,sys.argv[1]):
#如果包含,获取该成员
func = getattr(server,sys.argv[1])
func()
$ python3 day07.py start
Server is stating ...

如果要设置一个新的成员,则需要使用setattr(),删除的话则要使用delattr(),修改为:

def test_run(self,name):
print('Test_running ...',name,self.host)
if __name__ == '__main__':
server = WebServer('localhost',80)
if hasattr(server,sys.argv[1]):
func = getattr(server,sys.argv[1])
func()
setattr(server,'run',test_run)
server.run(server,'haha’)
#运行结果
Server is stating …
Test_running ... haha localhost

三、socket

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
    socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
    socket和file的区别:
file模块是针对某个指定文件进行【打开】【读写】【关闭】
socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

具体状态:

sk.bind(address)
    将套接字绑定到地址。adress地址的格式取决于地址族。以元组(host,port)的形式表示地址。
sk.listen(backlog)
    开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
    backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5.这个值不能无限大,因为内核中维护连接队列。
sk.setblock(bool)
    是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
sk.accept()
    接受连接并返回(conn,address)其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
    接收TCP客户的连接(阻塞式)等待连接的到来。
sk.connect(adress)
    连接到address处的套接字。address格式为元组。如果连接出错,返回socket.error错误。
sk.connect_ex(address)
    同上,区别是有返回值。连接成功返回0,失败则返回其他编码。
sk.close()
    关闭套接字
sk.recv(bufsize)
    接收套接字的数据。数据以字符串形式返回,bufsize可以指定最多可以接收的数量。
sk.send(string)
    将str中的数据发送到连接的套接字。返回值是要发送的字节数量。
sk.sendall(string)
    将str中的数据发送到连接的套接字,但在返回之前会尝试发送所有的数据。成功返回None,失败则抛出异常。
sk.sendto(string,address)
    将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是是发送的字节数。该函数主要用于UDP协议。
sk.settimeout(timeout)
    设置套接字操作的超时时间,最好在刚创建套接字时设置。
sk.getpeername()
    返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)
sk.getsockname()
    返回套接字自己的地址。
sk.fileno()
    套接字的文件描述符。

执行流程

server 端:
    1、创建套接字,绑定套接字到本地IP和端口

 ip_port = ('127.0.0.1',9998)
sk = socket.socket()
sk.bind(ip_port)

2、开始监听
        sk.listen(5)
    3、进入循环,不断接受客户端的连接请求

while True:
print('Server is waiting ... ‘)
conn,addr = sk.accept()

4、然后接收传来的数据,并发送给对方数据

 client_data = conn.recv(1024)
print(str(client_data,'utf-8’))
conn.sendall(bytes('这是 server !','utf-8’))

5、传输完毕,关闭套接字
    sk.close()
clinet端:
    1、创建套接字,绑定套接字到本地IP和端口

ip_port = ('127.0.0.1',9998)
sk = socket.socket()
sk.bind(ip_port)

2、连接后发送数据和接受数据
        sk.sendall()
        sk.recv()
    3、传输完毕后,关闭套接字()
        sk.close()

代码示例:实现client输入发送信息,server返回client输入的信息。

#server端
import socket
ip_port = ('127.0.0.1',9998)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5) while True:
print('Server is waiting ... ')
conn,addr = sk.accept()
client_data = conn.recv(1024)
print(str(client_data,'utf-8'))
conn.sendall(bytes('这是 server !','utf-8'))
while True:
client_data = conn.recv(1024)
print('revv:',str(client_data,'utf8'))
if not (client_data):break
conn.sendall(client_data)
#client端
import socket
ip_port = ('127.0.0.1',9998) sk = socket.socket()
sk.connect(ip_port) sk.sendall(bytes('这是 client !','utf-8'))
server_replay = sk.recv(1024)
print(str(server_replay,'utf-8'))
while True:
client_raw = input(':').strip()
sk.sendall(bytes(client_raw,'utf-8'))
server_replay = sk.recv(1024)
print(str(server_replay,'utf-8'))
sk.close()

代码示例:聊天工具

#server端
import socket
ip_port = ('127.0.0.1',9998) sk = socket.socket()
sk.connect(ip_port) sk.sendall(bytes('这是 client !','utf-8'))
server_replay = sk.recv(1024)
print(str(server_replay,'utf-8'))
while True:
  #区别在这里,增加输入,然后返回
client_raw = input('>> ').strip()
sk.sendall(bytes(client_raw,'utf-8'))
server_replay = sk.recv(1024)
print('server:',str(server_replay,'utf-8'))
sk.close()

Python高级之Socket 探索(五)的更多相关文章

  1. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  2. 第五篇:python高级之面向对象高级

    python高级之面向对象高级   python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...

  3. python高级(五)—— python函数(一等对象)

    本文主要内容 一等对象 普通函数 & 高阶函数 可调用对象 & 自定义可调用类型 函数内省 函数注释 python高级——目录 文中代码均放在github上:https://githu ...

  4. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

  5. 第六篇:python高级之网络编程

    python高级之网络编程   python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...

  6. 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...

  7. 老男孩Python高级全栈开发工程师【真正的全套完整无加密】

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师[真正的全套完整无加密] 课程大纲 老男孩python全栈,Python 全栈,Python教程,Django ...

  8. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  9. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

随机推荐

  1. 10-C语言函数

    目录: 一.函数 二.return与exit关键字 三.递归与递推 回到顶部 一.函数 1 函数由函数名.返回值.形参.函数体组成. 函数的使用分三个步骤:声明.定义.调用 2 语法格式: 返回值类型 ...

  2. LintCode-三数之和

    题目描述: 给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组. 注意事项 在三元组(a, b, c),要求a <= b <= c ...

  3. Hello China操作系统STM32移植指南(一)

    Hello China操作系统移植指南 首先说明一下,为了适应更多的文化背景,对Hello China操作系统的名字做了修改,修改为"Hello X",或者连接在一起,写为&quo ...

  4. hdoj 3549 Flow Problem(最大网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 思路分析:该问题为裸的最大网络流问题,数据量不大,使用EdmondsKarp算法求解即可:需要注 ...

  5. C功底挑战Java菜鸟入门概念干货(二)

    (接上篇博文:C功底挑战Java菜鸟入门概念干货(一)) 一.Java面向对象程序设计-类的基本形式 1.“类”是把事物的数据与相关的功能封装在一起,形成的一种特殊结构,用以表达对真实世界的一种抽象概 ...

  6. 深入理解java嵌套类和内部类

    一.什么是嵌套类及内部类 能够在一个类的内部定义还有一个类.这样的类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用非常少,最重要的是非静态嵌套类,也 ...

  7. 更新Windows Azure Web Site中的Orchard版本

    官方建议大家使用本地副本来更新 1.首先做个全站备份,这样更新好以后出问题你就很容易回滚 . Web Site 做备份很方便.把网站SCALE设置到STANDARD,然后在BACKUPS页面里面点备份 ...

  8. MySQL 5.7.14 安装

    http://www.cnblogs.com/zcGu/articles/5740936.html 因笔者个人需要需要在本机安装Mysql,先将安装过程记录如下,希望对他人有所参考. 一, 1, 进入 ...

  9. mysql支持emoji解决办法

    mysql显示不了emoji表情或者显示??,原因这里不解释,直接说解决办法.(主要就是修改utf8mb4) 1.修改表 ALTER TABLE `TABLE_NAME` CHARACTER SET ...

  10. poj 2992

    http://poj.org/problem?id=2992 大意:求(n,k)的因子个数 解题思路:(n,k) = n!/(k!(n-k)!)  任意一个数都可以用其质因子来表示  eg: 26 = ...