s21day22 python笔记

时间:2024-11-18 19:04:43

s21day22 python笔记

一、内容回顾及补充

  1. 模块补充
  • importlib.import_module:通过字符串的形式导入模块

    #示例一:
    import importlib
    # 用字符串的形式导入模块。
    redis = importlib.import_module('utils.redis')
    
    # 用字符串的形式去对象(模块)找到他的成员。
    getattr(redis,'func')()
    
    #示例二:
    import importlib
    middleware_classes = [
        'utils.redis.Redis',
        # 'utils.mysql.MySQL',
        'utils.mongo.Mongo'
    ]
    for path in middleware_classes:
        module_path,class_name = path.rsplit('.',maxsplit=1)
        module_object = importlib.import_module(module_path)# from utils import redis
        cls = getattr(module_object,class_name)
        obj = cls()
        obj.connect()
  1. 可迭代对象补充

    • 表象:可以被for循环的对象就可以称为是可迭代对象

    • 如何让一个对象变成可迭代对象?

      • 在类中实现__iter__方法且返回一个迭代器(生成器)
      # 示例一:
      class Foo:
          def __iter__(self):
              return iter([1,2,3,4])
      
      obj = Foo()
      
      # 示例二:
      class Foo:
          def __iter__(self):
              yield 1
              yield 2
              yield 3
      
      obj = Foo()
    • 注意:只要能被for循环,就是去看他内部的__iter__方法

二、数据结构

2.1 队列

  • 先进先出

2.2 栈

  • 后进先出

    class Stack(object):
        """
        后进先出
        """
        def __init__(self):
            self.data_list = []
        def push(self, val):
            """
            向栈中压入一个数据(入栈)
            """
            self.data_list.append(val)
        def pop(self):
            """
            从栈中拿走一个数据(出栈)
            """
            return self.data_list.pop()

三、 约束

  • 示例

    # 约束子类中必须写send方法,如果不写,则调用时候就报抛出 NotImplementedError
    class BaseMessage(object):
        def send(self,a1):
            raise NotImplementedError('子类中必须有send方法')
    
    class Msg(BaseMessage):
        def send(self):
            pass
    
    class Email(BaseMessage):
        def send(self):
            pass
    
    class DingDing(BaseMessage):
        def send(self):
            print('钉钉')
    
    obj = Email()
    obj.send()

四、 反射

  • 根据字符串的形式去某个对象中操作他的成员

4.1 getattr(对象,字符串)

  • 根据字符串的形式去某个对象中获取该成员

    class Foo(object):
        def __init__(self,name):
            self.name = name
    obj = Foo('alex')
    
    # 获取变量
    v1 = getattr(obj,'name')
    # 获取方法
    method_name = getattr(obj,'login')
    method_name()

4.2 hasattr(对象,字符串)

  • 根据字符串的形式去某个对象中判断是否有该成员

    from wsgiref.simple_server import make_server
    class View(object):
        def login(self):
            return '登陆'
        def logout(self):
            return '等处'
        def index(self):
            return '首页'
    
    def func(environ,start_response):
        start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
        obj = View()
        # 获取用户输入的URL
        method_name = environ.get('PATH_INFO').strip('/')
        if not hasattr(obj,method_name):
            return ["sdf".encode("utf-8"),]
        response = getattr(obj,method_name)()
        return [response.encode("utf-8")  ]
    
    # 作用:写一个网站,用户只要来方法,就自动找到第三个参数并执行。
    server = make_server('192.168.12.87', 8000, func)
    server.serve_forever()

4.3 setattr(对象,字符串,值)

  • 根据字符串的形式去某个对象中设置/修改该成员

    class Foo:
        pass
    
    obj = Foo()
    obj.k1 = 999
    setattr(obj,'k1',123) # obj.k1 = 123
    print(obj.k1)

4.4 delattr(对象,字符串)

  • 根据字符串的形式去某个对象中删除该成员

    class Foo:
        pass
    
    obj = Foo()
    obj.k1 = 999
    delattr(obj,'k1')
    print(obj.k1)

4.5 python一切皆对象

  1. 对象的定义
    • 狭义:类实例化出来的就是对象
    • 广义:
      • 模块(py文件)及其内部成员
      • 包(文件夹)及其内部成员
      • 类及其内部成员
      • 狭义的对象
  2. python一切皆对象,所以以后想要通过字符串的形式操作其内部成员都可以通过反射的机制实现