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一切皆对象,所以以后想要通过字符串的形式操作其内部成员都可以通过反射的机制实现

s21day22 python笔记的更多相关文章

  1. Python笔记之不可不练

    如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...

  2. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  3. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

  4. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  5. 13.python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

  6. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  7. python笔记 - day8

    python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...

  8. python笔记 - day7-1 之面向对象编程

    python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...

  9. python笔记 - day7

    python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblog ...

随机推荐

  1. Linux c codeblock的使用(四):创建自己的静态函数库

    从我之前的博文当中,大家应该大概了解了linux下的函数库究竟是一个什么样的东西.linux下的函数库其实就像windows中的dll文件,里面包含了程序运行所需要的函数. 其实无论是我们使用linu ...

  2. 获取Promise的值

    //response.text()是一个promise对象 //通过then方法获取promise存的数据 response.text().then(val => { errObj = JSON ...

  3. 总结get和post区别---面试用

    总结get和post区别---面试用 我是搬运工!!!! get参数通过url传递,post放在request body中. get请求在url中传递的参数是有长度限制的,而post没有. get比p ...

  4. 编码 decode & encode

    import sys # python3 中字符编码默认为 utf-8 s = '你好' print(s) # utf-8 转为 gbk (s 默认为 unicode 所以可以直接 encode 成 ...

  5. LeetCode算法历程-02

    编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例 1: 输入: 6 输出: true 解释: 6 = 2 × 3 示例 2: 输入: 8 输出: true ...

  6. Cowboy http服务器 websocket

    一.基础介绍 cowboy是一个小巧.快速.模块化的http服务器,采用Erlang开发.其中良好的clean module使得我们可以扩展到多种网络协议之中,cowboy自带的有tcp和ssl,而也 ...

  7. 最佳sql server 分页查询

    用关键字查询 并作为条件是最快的,比其他嵌套select性能都要好 select top 100 id , name from tablex where id >preid order by i ...

  8. centos 设置中文

    [root@mts /]# vim /etc/sysconfig/i18n 1 LANG="en_US.UTF-8" 2 SYSFONT="latarcyrheb-sun ...

  9. 每天一点Linux系列之—vim

  10. linux 清理几天前的日志或文件

    执行清理1天前的 war 包 find . -ctime +1 -name "*.war" -exec rm {} \;