今日内容

  • 讲作业

    • 顺序查找
  • 可迭代对象
  • 约束 + 异常
  • 反射

内容详细

1.作业

1.1 代码从上到下执行

  1. print('你好')
  2. def func():
  3. pass
  4. func()
  1. class Foo:
  2. X = 1
  3. def func(self):
  4. pass
  5. Foo.X
  1. class Foo:
  2. print('你好')
  3. def func(self):
  4. pass
  1. class Foo:
  2. x = 1
  3. def func(sef):
  4. pass
  5. class Meta:
  6. y = 123
  7. def show(self):
  8. pass
  1. class Foo:
  2. print('你')
  3. x = 1
  4. def func(sef):
  5. pass
  6. class Meta:
  7. print('好')
  8. y = 123
  9. def show(self):
  10. pass

1.2 栈

  1. class Stack(object):
  2. """
  3. 后进先出
  4. """
  5. def __init__(self):
  6. self.data_list = []
  7. def push(self, val):
  8. """
  9. 向栈中压入一个数据(入栈)
  10. :param val:
  11. :return:
  12. """
  13. self.data_list.append(val)
  14. def pop(self):
  15. """
  16. 从栈中拿走一个数据(出栈)
  17. :return:
  18. """
  19. return self.data_list.pop()

2.可迭代对象

表象:可以被for循环对象就可以称为是可迭代对象: "x" [11,2] {}...

  1. class Foo:
  2. pass
  3. obj = Foo()

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

在类中实现__iter__方法且返回一个迭代器(生成器)

  1. class Foo:
  2. def __iter__(self):
  3. return iter([1,2,3,4])
  4. obj = Foo()
  5. class Foo:
  6. def __iter__(self):
  7. yield 1
  8. yield 2
  9. yield 3
  10. obj = Foo()

记住:只要能被for循环就是去看他内部的iter方法。

3.约束

  1. # 约束字类中必须写send方法,如果不写,则调用时候就报抛出 NotImplementedError
  2. class Interface(object):
  3. def send(self):
  4. raise NotImplementedError()
  5. class Message(Interface):
  6. def send(self):
  7. print('发送短信')z
  8. class Email(Interface):
  9. def send(self):
  10. print('发送邮件')
  1. class Message(object):
  2. def msg(self):
  3. print('发短信')
  4. def email(self):
  5. print('邮件')
  6. def wechat(self):
  7. print('微信')
  8. obj = Message()
  9. obj.msg()
  10. obj.email()
  11. obj.wechat()
  1. class BaseMessage(object):
  2. def send(self,a1):
  3. raise NotImplementedError('字类中必须有send方法')
  4. class Msg(BaseMessage):
  5. def send(self):
  6. pass
  7. class Email(BaseMessage):
  8. def send(self):
  9. pass
  10. class Wechat(BaseMessage):
  11. def send(self):
  12. pass
  13. class DingDing(BaseMessage):
  14. def send(self):
  15. print('钉钉')
  16. obj = Email()
  17. obj.send()

4.反射

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

  • getattr(对象,"字符串") 根据字符粗的形式去某个对象中 获取 对象的成员。

    1. class Foo(object):
    2. def __init__(self,name):
    3. self.name = name
    4. obj = Foo('alex')
    5. # 获取变量
    6. v1 = getattr(obj,'name')
    7. # 获取方法
    8. method_name = getattr(obj,'login')
    9. method_name()
  • hasattr(对象,'字符串') 根据字符粗的形式去某个对象中判断是否有该成员。

    1. #!/usr/bin/env python
    2. # -*- coding:utf-8 -*-
    3. from wsgiref.simple_server import make_server
    4. class View(object):
    5. def login(self):
    6. return '登陆'
    7. def logout(self):
    8. return '等处'
    9. def index(self):
    10. return '首页'
    11. def func(environ,start_response):
    12. start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
    13. #
    14. obj = View()
    15. # 获取用户输入的URL
    16. method_name = environ.get('PATH_INFO').strip('/')
    17. if not hasattr(obj,method_name):
    18. return ["sdf".encode("utf-8"),]
    19. response = getattr(obj,method_name)()
    20. return [response.encode("utf-8") ]
    21. # 作用:写一个网站,用户只要来方法,就自动找到第三个参数并执行。
    22. server = make_server('192.168.12.87', 8000, func)
    23. server.serve_forever()
  • setattr(对象,'变量','值') 根据字符粗的形式去某个对象中设置成员。

    1. class Foo:
    2. pass
    3. obj = Foo()
    4. obj.k1 = 999
    5. setattr(obj,'k1',123) # obj.k1 = 123
    6. print(obj.k1)
  • delattr(对象,'变量') 根据字符粗的形式去某个对象中删除成员。

    1. class Foo:
    2. pass
    3. obj = Foo()
    4. obj.k1 = 999
    5. delattr(obj,'k1')
    6. print(obj.k1)

python一切皆对象

  • py文件
  • 对象

python一切皆对象,所以以后想要通过字符串的形式操作其内部成员都可以通过反射的机制实现。

5. 模块:importlib

根据字符串的形式导入模块。

  1. #from utils import redis
  2. import importlib
  3. #用字符串的形式导入模块。
  4. redis=importlib.import_module('utils.redis')
  5. getattr(redis,'func')()
  6. 模块 = importlib.import_module('utils.redis')
  1. import importlib
  2. path='utils.mongo.func'#mongo.py,utils为目录名称
  3. module_path,func_name=path.rsplit('.',maxsplit=1)
  4. module_object=importlib.import_module(module_path)
  5. getattr(module_object,func_name)()

python笔记22(面向对象课程四)的更多相关文章

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

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

  2. Python:笔记(3)——面向对象编程

    Python:笔记(3)——面向对象编程 类和面向对象编程 1.类的创建 说明:和Java不同的是,我们不需要显示的说明类的字段属性,并且可以在后面动态的添加. 2.构造函数 构造函数的功能毋庸置疑, ...

  3. 9.Python笔记之面向对象高级部分

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

  4. Python入门之面向对象编程(四)Python描述器详解

    本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法.静态方法和类方法的描述器原理 property装饰 ...

  5. Python笔记之面向对象

    1.类和对象 #create a class class fruit: def say(self): print "hello, python" if __name__ == &q ...

  6. python学习笔记_week6_面向对象

    面向对象 介绍(特性(class.object--->封装.继承,多态)).--->世界万物,皆可分类:世界万物,皆可对象 只要是对象,就肯定属于某种品类:只要是对象,就肯定有属性 你是上 ...

  7. python全栈开发 * 22 面向对象 知识点汇总 * 180703

    22 面向对象 -----属性,类方法,静态方法,反射一.属性1.属性的定义:将方法伪装成属性,虽然在代码层面上没有任何高深之处,但让其看起来更合理. (类似于属性的方法)class Person: ...

  8. python学习笔记(10):面向对象

    一.类和实例 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 2.对象:通过类定义的数据结构实例.对象包括两个数据成员( ...

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

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

随机推荐

  1. 【转】Eclipse快捷键指南

    目录 1 编辑 2 查看 3 窗口 4 导航 5 搜索 6 文本编辑 7 文件 8 项目 9 源代码 10 运行 11 重构 12 修改快捷键 Eclipse快捷键,熟悉快捷键可以帮助开发事半功倍,节 ...

  2. Java之File类用法总结

    File类概述:文件和文件目录路径的抽象表达形式,与平台无关.1.File能新建.删除.重命名文件和目录,但File不能访问文件内容本身.如果需要访问文件内容本身,则需要使用输入/输出流.2.想要在J ...

  3. 开启我的python之路,第一节,git版本管理工具

    git版本管理工具 一.git功能与结构 1.Git是分布式管理系统,服务端和客户端都有版本控制功能,都能进行代码的提交,合并 2.git分为工作区,暂存区,本地仓库和远程仓库 二.git安装与查看 ...

  4. 我是如何做到springboot自动配置原理解析

    一前言 springboot 2.0.0版本分析,整体的自动配置流程如下: 具体配置参考官方文档:springboot-doc 二 @SpringBootApplication 核心注解@Spring ...

  5. szTom's Code Style

    介绍szTom在C++中使用的代码风格. 头文件 必须使用using namespace std; 如果是C头文件,必须使用c前缀文件名. #include <cstdio> 而不是 #i ...

  6. cogs 1176. [郑州101中学] 月考 Set 做法

    1176. [郑州101中学] 月考 ★★☆   输入文件:mtest.in   输出文件:mtest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在上次的月考中B ...

  7. SpringBoot项目配置Date类型数据自动格式转换

    application.yml加入配置 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8

  8. 解析Json字符串中的指定的值

    { "head": { ", "Id": "20191008144448iAQE", "Message": & ...

  9. Linux初始化Git环境

    第一步:设置Git全局用户名和邮箱 git config --global user.name "你的用户名" git config --global user.email &qu ...

  10. 全网最详细!Centos7.X 搭建Grafana+Jmeter+Influxdb 性能实时监控平台

    背景 日常工作中,经常会用到Jmeter去压测,毕竟LR还要钱(@¥&*...),而最常用的接口压力测试,我们都是通过聚合报告去查看压测结果的,然鹅聚合报告的真的是丑到家了,作为程序猿这当然不 ...