这周还是继续关于类的学习,在面向对象的学习过程中又学习了网络编程,并且提交了编写FTP的作业。

复习一下类的相关概念和定义

     属性
          实例变量:内存中
          类变量: 类的内存,实例共享
          私有属性__var
     方法
          构造方法: 初始化
          析构方法: 实例销毁的时候
          私有方法   
          静态方法:只是名义上的归类管理,实际上在静态方法中无法访问类中的任何属性。            
          属性方法:把一个方法变成静态属性         
          类方法:可以使用类变量,不能访问实例中的变量 
          
对象:一个类的实例
     封装
          把一些功能的实现细节,不对外暴露          
     继承
          代码的重用
          单集成
           多继承
                2.7 经典类,深度优先     新式类,广度优先
                3.x 均是广度优先
                class Foo(object)
               def __init__(self,name,age,sex,salary,course):
                    super(Foo,self).__init__(name,age,sex)
                    self.salary = salary
                    self.course = course          
     多态
          接口的重用,一种接口,多种实现
 
 下面是一个Socket通信的实例:
Server端
  1. #Authon Ivor
  2. import socket
  3. import json
  4. import os
  5.  
  6. ip = ('localhost',9999)
  7. s = socket.socket()
  8. s.bind(ip)
  9. s.listen(5)
  10.  
  11. while True:
  12. print("等待连接中....")
  13. conn,client_addr = s.accept()
  14. print("有用户主动接入:", conn, client_addr)
  15. while True:
  16. data = conn.recv(4096)
  17. data = json.loads(data.decode('utf-8'))
  18. if data.get('action') is not None:
  19. if data['action'] == 'put':
  20. file_obj = open(data['file_name'],'wb')
  21. receive_size = 0
  22. file_size = data['file_size']
  23. while receive_size < file_size:
  24. recv = conn.recv(4096)
  25. file_obj.write(recv)
  26. receive_size += len(recv)
  27. print(file_size,receive_size)
  28. file_obj.close()
  29. print("File receive complete!")
  30. elif data['action'] == 'get':
  31. pass

Client端

  1. #Authon Ivor
  2. import os
  3. import json
  4. import socket
  5.  
  6. client = socket.socket()
  7. client.connect(('localhost',9999))
  8. while True:
  9. choice = input(">>>:")
  10. if len(choice) == 0:continue
  11. cmd_list = choice.split()
  12. if cmd_list[0] == 'put':
  13. if cmd_list[-1]:
  14. file_name = cmd_list[-1]
  15. if os.path.isfile(file_name):
  16. base_filename = file_name.split("/")[-1]
  17. file_size = os.path.getsize(file_name)
  18. file_obj = open(file_name,'rb')
  19. data_header = {
  20. "action":"put",
  21. "file_name":base_filename,
  22. "file_size":file_size
  23. }
  24. client.send(json.dumps(data_header).encode('utf-8'))
  25. for line in file_obj:
  26. client.send(line)
  27. print("File send complete.".center(50,'-'))
  28. else:
  29. print("File is not exists.")
  30. else:
  31. print("Need a file...")
  32. elif cmd_list[0] == 'get':
  33. pass
  34. else:
  35. print("Wrong input.")

如果想要实现多并发连接也很简单,Socket自带了多线程的TCP服务

需要定义一个继承socketserver.BaseRequestHandler的Handler,

并且重定义handler函数,通过self.request.recv()/self.request.send()

  1. #Authon Ivor
  2. import socketserver
  3.  
  4. class MyHandelclass(socketserver.BaseRequestHandler):
  5.  
  6. def handle(self):
  7. while True:
  8. self.data = self.request.recv(4096)
  9. print(self.client_address)
  10. print(self.data)
  11. self.request.sendall(self.data.upper())
  12.  
  13. if __name__ == '__main__':
  14. server = socketserver.ThreadingTCPServer(('localhost',9999),MyHandelclass)
  15. server.serve_forever()

Client端不需要变动

  1. #Authon Ivor
  2. import os
  3. import json
  4. import socket
  5.  
  6. client = socket.socket()
  7. client.connect(('localhost',9999))
  8. while True:
  9. choice = input(">>>:")
  10. if len(choice) == 0:continue
  11. client.send(choice.encode('utf-8'))
  12. data =client.recv(1024)
  13. print(data)

下一个重要的知识点,反射,通过字符串判断类中是否存在这个方法

  1. #Authon Ivor
  2. def bark(self):
  3. print("%s is yelling!" % self.name )
  4.  
  5. class Dog(object):
  6.  
  7. def __init__(self,name):
  8. self.name = name
  9.  
  10. def eat(self):
  11. print("%s is eating!" % self.name)
  12.  
  13. d= Dog("Wangwang")
  14. choice = input(">>>:")
  15.  
  16. if hasattr(d,choice):
  17. func = getattr(d,choice)
  18. func()
  19. else:
  20. setattr(d,choice,bark) #d.choice = bark
  21. func = getattr(d,choice)
  22. func(d)

异常处理

  1. #Authon Ivor
  2.  
  3. name = [0,1,2]
  4. dic = {}
  5.  
  6. try:
  7. name[3]
  8. except IndexError as e :
  9. print(e)
  10. try:
  11. dic['']
  12. except KeyError as e:
  13. print("KeyError",e)
  14.  
  15. except Exception as e:
  16. print("可以抓到任何错误!")
  17. else:
  18. print("没有错误时我会运行!")
  19. finally:
  20. print("不管怎么样,我都会运行!")
  21.  
  22. # 常用异常
  23. # AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
  24. # IOError 输入/输出异常;基本上是无法打开文件
  25. # ImportError 无法引入模块或包;基本上是路径问题或名称错误
  26. # IndentationError 语法错误(的子类) ;代码没有正确对齐
  27. # IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  28. # KeyError 试图访问字典里不存在的键
  29. # KeyboardInterrupt Ctrl+C被按下
  30. # NameError 使用一个还未被赋予对象的变量
  31. # SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  32. # TypeError 传入对象类型与要求的不符合
  33. # UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
  34. # 导致你以为正在访问它
  35. # ValueError 传入一个调用者不期望的值,即使值的类型是正确的

类的其他特殊成员方法

  1. #Authon Ivor
  2.  
  3. class Foo(object):
  4. #定义类的原类
  5. __metaclass__ = type
  6.  
  7. #类中所有的方法和属性
  8. #__dict__
  9.  
  10. #构造函数,创建对象时调用
  11. def __init__(self,name,age):
  12. super(Foo,self).__init__()
  13. self.age = age
  14. self.name = name
  15. #定义对象的调用方式
  16. def __call__(self, *args, **kwargs):
  17. print("I'm the __call__ .")
  18. #打印对象时,使用这个函数的返回值
  19. def __str__(self):
  20. return "%s" % self.name
  21.  
  22. def __new__(cls, *args, **kwargs):
  23. print("I'm the __new__!")
  24. return object.__new__(cls)
  25. def __del__(self):
  26. pass
  27.  
  28. f = Foo("ivor",27)
  29. f()
  30.  
  31. #类的第二种定义方法,一切皆对象,类也是对象,源于type
  32. def func(self):
  33. print("hello %s"%self.name)
  34.  
  35. def __init__(self,name,age):
  36. self.name = name
  37. self.age = age
  38. Foo = type('Foo',(object,),{'func':func,'__init__':__init__})
  39. f = Foo("jack",22)
  40. f.func()

以下是这次作业的ReadMe

程序说明:
    1.启动服务端
  ./FTP_Server/bin/ftp_server.py start
  端口号为9999,写入了settings的配置文件里。
    2.启动客户端
  ./FTP_Client/ftp_client -s localhost -p 9999 -u Ivor -P abc123
  Ivor abc123  /  Jack abc123
  用户名密码也可以连接后输入,有两个用户,写在了accounts里。
    3.连接成功后,用户默认所在目录为家目录。
程序功能:
    1.put  --md5(可选)
 向服务器上传文件,服务器会检验是否超过了分配空间,有空间则上传,空间不足则返回错误。md5一致性检验为可选项
    2.get  --md5(可选)
 从服务器下载文件。md5一致性检验为可选项
    3.ls
 列出当前目录的文件。试用于linux系统
    4.dir
 列出当前目录的文件。试用于linux系统和windows系统

Python学习-day7 类 部分socket的更多相关文章

  1. Python学习:类和实例

    Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...

  2. Python学习笔记——类和对象

    类和对象 1. 一个例子 # 对象 = 属性 + 方法 # Python 中的类名称约定首字母大写,而 Python 函数名首字母小写 class Turtle: #属性 color = 'green ...

  3. python学习19类5之多态与鸭子模型

    '''''''''一.多态1.Python中多态是指一类事物有多种形态.''' class Animal: def run(self): raise AttributeError('子类必须实现这个方 ...

  4. python学习day7

    目录 一.反射 二.socket 三.socketserver 一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分 ...

  5. python面向对象、类、socket网络编程

    类和对象 python3统一了类与类型的概念:类==类型:从一组对象中提取相似的部分就是类:特征与技能的结合体就叫做对象: 类的功能: 初始实例化: 属性引用: 1.数据属性: 2.函数属性: 对于一 ...

  6. Python学习之路15☞socket编程

    一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二 os ...

  7. python学习08——类

    笨办法学python第42节,这节讲的是类,程序沿用上一节中一个游戏,不同的是这一节用了类的方法. 其中改动的代码主要如下 原来的最后几句用了这样的代码: ROOMS = { 'death':deat ...

  8. python学习笔记七 初识socket(进阶篇)

    socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  9. Python学习_11_类和实例

    类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:    pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的 ...

随机推荐

  1. 【Unity3D】实现太阳系

    实践要求:写一个程序,实现一个完整的太阳系,其他星球围绕太阳的转速必须不一样,并且不再一个法平面内. 法平面是指过空间曲线的切点,且与切线垂直的平面.要求不在一个法平面内,则在保证所有行星以及太阳在一 ...

  2. iOS 应用架构 (一)

    摘要:iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第一篇,主要讲架构设计的通识和方法论等,同时还讨论了大家关心 ...

  3. 大会聚焦 | 开源技术盛会LinuxCon首次来到中国,大咖齐聚关注业界动态

    2017年6月19-20日,开源技术盛会LinuxCon + ContainerCon + CloudOpen(LC3)首次在中国举行.两天议程满满,包括 17 个主旨演讲.8 个分会场的 88 场技 ...

  4. SQLAlchemy的基本使用

    一.介绍 SQLAlchemy是一种ORM(Object-Relational Mapping)框架,用来将关系型数据库映射到对象上.该框架建立在DB API之上,将类和对象转化成SQL,然后使用AP ...

  5. Python使用easy-install安装时报UnicodeDecodeError的解决方法

    Python使用easy-install安装时报UnicodeDecodeError的解决方法,有需要的朋友可以参考下. 问题描述: 在使用easy-install安装matplotlib.pypar ...

  6. [windows]窗口文件夹中使用常见任务

    文件夹中使用常见任务,如截图所示增加红色框部分. 设置步骤: 我的电脑--〉右键--〉属性--〉高级选项--〉性能设置--〉自定义:勾选在文件夹中使用常见任务.

  7. SDUT 1309 不老的传说问题 (区间DP)

    题意: 有一个环形序列,n个数字表示一种颜色,要求将白板环刷成一模一样的环,限制是每次最多只能刷连续的K个位置,问最少需要刷几次? 思路: 跟2008长春那道painter string 差不多.只是 ...

  8. Beta版本发布

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/?page=2 这个作业要求在哪里 <作业要求的 ...

  9. CMDB API验证

    CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...

  10. Vue-Quill-Editor 修改配置,和图片上传

    1.富文本编辑器中的图片上传是将图片转为base64格式的,如果需要上传图片到自己的服务器,需要修改配置. 创建一个quill-config文件 /*富文本编辑图片上传配置*/ /*富文本编辑图片上传 ...