目录:

  一、基础概念

    1、动态导入模块

    2、断言机制

    3、SocketServer

  二、作业 FTP服务器

  三、单独注明

    1、类中装饰器

    2、进度条

 

 一、基础概念

  1、动态导入模块

  有时在编程过程中,如果知道模块对应的字符串,可以通过动态导入的方式将该字符对应的模块进行动态导入

导入的方式有两种:

  1、python解释器默认的方式导入

  2、官方推荐动态导入方式

下面来分别介绍以下两种方式:

Python学习笔记第八周

lib模块中包括aa文件,aa文件内容如下:

class C(object):

    def __init__(self):
        self.name = 'gavin'

通过方法一导入:

modname = 'lib'  #知道模块名字对应字符串


mod = __import__('lib.aa') #导入lib同时导入lib模块下的aa,但是这个mod只是lib,而不是lib.aa  要记住

obj = mod.aa.C()#因为mod只表示lib,所以需要写成mod.aa表示lib.aa
print(obj.name)

通过方法二导入:

import importlib
mod = importlib.import_module('lib.aa') #官方建议这种方法更有效,mod直接表示了lib.aa

obj = mod.C() print(obj.name)

 

  2、断言机制

 断言的作用:

当后续的程序很重要,不允许出错,可以在该程序前添加断言机制,当断言不正确就不执行,断言正确会继续执行后续的程序

例子:

借用上面的lib模块引用,当引用该模块后,发现其中的类型为str类型后,打印,然后将类型断言变为int类型,此时会发现原来正常打印执行的语句不再执行

  1、正确打印:

import importlib

mod_name = 'lib.aa'
mod = importlib.import_module(mod_name)

obj = mod.C()
assert type(obj.name) is str
print('断言正确执行')
#输出
断言正确执行

  2、忽略打印动作

import importlib

mod_name = 'lib.aa'
mod = importlib.import_module(mod_name)

obj = mod.C()
assert type(obj.name) is int
print('断言正确执行')
#输出
raceback (most recent call last):
  File "/Users/Gavin/PycharmProjects/python/day8/复现/2-断言/断言.py", line 7, in <module>
    assert type(obj.name) is int
AssertionError

 

   3、socketserver

socketserver是一个模块,该模块简化了编写网络服务器的任务复杂度

socketserver一共有这么几种类型

  1、tcp类型

class socketserver.TCPServer(server_address, RequestHandlerClass,bind_and_activate=True)

  2、udp类型

class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)

  3、使用Unix domain方式socket类型

class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)
这几种类的继承关系如下:
+------------+ | BaseServer | +------------+ | v +-----------+ +------------------+ | TCPServer |------->| UnixStreamServer | +-----------+ +------------------+ | v +-----------+ +--------------------+ | UDPServer |------->| UnixDatagramServer | +-----------+ +--------------------+

创建一个socketserver至少分以下几个步骤:

  1、必须创建一个请求处理类,这个要继承BaseRequestHandler类并且要重写父类里的handle方法

  2、必须要实例化一个其中任意类型的类,同时传递Server IP和上面创建的请求处理类给这个任意类

  3、调用类方法

  类方法包含以下两种:

    1、server.serve_request() #只处理一个请求,不会使用这个

    2、server.serve_forever()#处理多个请求,永远执行着调用

  4、关闭server.serve_forever()

  注意:跟客户端所有交互,都是在handle()方法中完成的,每个请求过来以后,都是通过handle来规定处理行为

 基本的sockerserver代码

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()
View Code

相关文章:

  • 2021-06-02
  • 2022-02-18
  • 2021-06-22
  • 2021-11-05
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-13
  • 2021-06-04
  • 2021-06-22
  • 2021-05-08
  • 2021-05-07
相关资源
相似解决方案