s21day21 python笔记

一、内容回顾及补充

  • 内置函数补充

    • type():查看数据类型

      class Foo:
          pass
      
      obj = Foo()
      if type(obj) == Foo:
          print('obj是Foo类的对象')
    • issubclass(类,类或其基类):判断前一个类是否是后一个类或其基类的子类

      • 结果是布尔类型,是 -> True,否 -> False
      class Base:
          pass
      
      class Base1(Base):
          pass
      
      class Foo(Base1):
          pass
      
      class Bar:
          pass
      
      print(issubclass(Bar,Base))
      print(issubclass(Foo,Base))
    • isinstance(对象,类或其基类):判断一个对象是否是一个类或其基类的实例(对象)

      • 结果是布尔类型,是 -> True,否 -> False
      • 注意:判断一个对象是否是一个类的实例(对象),一定要用type,不要用isinstance
      class Base(object):
          pass
      
      class Foo(Base):
          pass
      
      obj = Foo()
      print(isinstance(obj,Foo))  # 判断obj是否是Foo类或其基类的实例(对象)
      print(isinstance(obj,Base)) # 判断obj是否是Foo类或其基类的实例(对象)
    • super().方法名():根据self对象所属的类的继承关系,按照顺序依次找方法并执行(找到第一个为止)

      class Base(object):
          def func(self):
              super().func()  # 根据self对象所属类的继承关系,按照顺序挨个找func方法并执行(找到第一个为止)
              print('base.func')
      
      class Bar(object):
          def func(self):
              print('bar.func')
      
      class Foo(Base,Bar): # Foo -> Base -> Bar
          pass
      
      obj = Foo()
      obj.func()

二、特殊成员

  • 特殊成员:就是为了能够快速实现执行某些方法而生

2.1 __init__

  • 初始化方法
  • 用途:用于给对象中赋值
class Foo:
    def __init__(self,a1):
        self.a1 = a1

obj = Foo('alex')

2.2 __new__

  • 构造方法
  • 用于创建空对象
class Foo(object):
    def __init__(self):
        self.x = 123
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls)

obj = Foo()     # 先执行__new__方法,再执行__init__方法

2.3 __call__

  • 对象后面加括号执行该方法
class Foo(object):
    def __call__(self, *args, **kwargs):
        print('执行call方法')

obj = Foo()
obj()        # 对象后面加括号,执行__call__方法
# 相当于Foo()()
  • 网站示例:
from wsgiref.simple_server import make_server

def func(environ,start_response):
    start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
    return ['你好'.encode("utf-8")  ]

class Foo(object):
    def __call__(self, environ,start_response):
        start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])
        return ['你<h1 style="color:red;">不好</h1>'.encode("utf-8")]

# 作用:写一个网站,用户只要来方法,就自动找到第三个参数并执行。
server = make_server('127.0.0.1', 8000, Foo())
server.serve_forever()

2.4 __getitem__ __setitem__ __delitem__

class Foo(object):
    def __setitem__(self, key, value):
        pass
    def __getitem__(self, item):
        return 'uuu'
    def __delitem__(self, key):
        pass

obj1 = Foo()
obj1['k1'] = 123        # 内部会自动调用 __setitem__方法
val = obj1['xxx']       # 内部会自动调用 __getitem__方法,用val接受返回值
del obj1['ttt']         # 内部会自动调用 __delitem__ 方法

2.5 __str__

  • 只有在打印对象时,会自动化调用此方法,并将其返回值在页面显示出来
class Foo(object):
    def __str__(self):
        return 'asdfasudfasdfsad'

obj = Foo()
print(obj)     # obj是一个对象,打印__str__方法的返回值
  • 示例:
class User(object):
    def __init__(self,name,email):
        self.name = name
        self.email = email
    def __str__(self):
        return "%s %s" %(self.name,self.email,)

user_list = [User('二狗','2g@qq.com'),User('二蛋','2d@qq.com'),User('狗蛋','xx@qq.com')]
for item in user_list:
    print(item)

2.6 __dict__

  • 去对象中找到所有变量并将其转换为字典
class Foo(object):
    def __init__(self,name,age,email):
        self.name = name
        self.age = age

obj = Foo('alex',19)
val = obj.__dict__     # 去对象中找到所有变量并将其转换为字典
print(val)

2.7 __enter__ __exit__

  • 上下文管理
# 面试题
class Foo(object):
    def do_something(self):
        print('内部执行')      # 第三步

class Context:
    def __enter__(self):
        print('进入')           # 第一步
        return Foo()
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('推出')      # 第四步

with Context() as ctx:
    print('内部执行')      # 第二步
    ctx.do_something()

2.8 __add__

  • 两个对象相加时用到此方法
class Foo(object):
    def __add__(self, other):    # self:obj1,other:obj2
        return 123      

obj1 = Foo()
obj2 = Foo()
val  = obj1 + obj2    # 内部会自动调用 __add__方法,并用val接受返回值
print(val)      # 123

三、异常处理

3.1 基本格式

# 示例一:
import requests
try:     # 尝试进行下面操作,如果可以执行,就执行下面代码
    ret = requests.get('http://www.google.com')
    print(ret.text)
except Exception as e:   # 如果不可以执行(平时会报错),这时不会报错,执行下面代码
    print('请求异常')   

# 示例二:
try:
    v = []
    v[11111]          # IndexError类型的异常
except ValueError as e:   # ValueError是一个类,继承Exception,只能捕获到ValueError类型的异常
    pass
except IndexError as e:   # IndexError是一个类,继承Exception,只能捕获到IndexError类型的异常
    pass
except Exception as e:    # Exception是一个类,可以捕获到所有异常
    print(e)           # e是Exception类的对象,存储了一个错误信息
  • finally

    try:
        int('asdf')
    except Exception as e:
        print(e)
    finally:
        print('最后无论对错都会执行')
    
    # 特殊情况:
    def func():
        try:
            int('asdf')
        except Exception as e:
            return 123
        finally:
            print('最后')   # 无论对错,函数中遇到return,也会执行,执行完后再return
    
    func()
  • 建议:书写函数或功能时,建议用try包裹一下,避免报错

  • 示例

    # 1. 写函数,函数接受一个列表,请将列表中的元素每个都 +100
    def func(arg):
        result = []
        for item in arg:
            if item.isdecimal():
                result.append(int(item) + 100)
      return result 
    
    # 2. 写函数去,接受一个列表。列表中都是url,请访问每个地址并获取结果
    import requests
    def func1(url_list):
        result = []
        try:
            for url in url_list:
                response = requests.get(url)
                result.append(response.text)
      except Exception as e:
            pass
      return result 
    
    def func2(url_list):
        result = []
        for url in url_list:
            try:
                response = requests.get(url)
                result.append(response.text)
            except Exception as e:
                pass
      return result 
    
    # 这两个函数执行结果是不一样的,是try所处的位置不同导致的
    func1(['http://www.baidu.com','http://www.google.com','http://www.bing.com'])
    func2(['http://www.baidu.com','http://www.google.com','http://www.bing.com'])

3.2 主动触发异常

try:
    int('123')
    raise Exception('XXX')     # 代码中主动抛出异常
except Exception as e:
    print(e)     # XXX
  • 示例:

    def func():
        result = True
        try:
            with open('x.log',mode='r',encoding='utf-8') as f:
                data = f.read()
            if 'alex' not in data:
                raise Exception()
        except Exception as e:
            result = False
        return result

3.3 自定义异常

class MyException(Exception):    # 自定义异常,继承Exception
    pass

try:
    raise MyException('asdf')    # 主动触发自定义异常,只有自定义异常自己和Exception能捕获到
except MyException as e:
    print(e)

s21day21 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. 小程序for循环绑定每组数据的id,并通过id获取里面某个数组的值的方法

    WXML: <block wx:for="{{nums}}" wx:for-index='key' wx:for-item='item'> <view class ...

  2. postman安装

    安装包下载下来,解压缩到你喜欢的位置. 打开 Chrome 浏览器的「扩展程序」 点击「加载已解压的扩展程序...」按钮,找到你刚刚下载的安装包的位置,点击确定. 你去看看 Windows 的开始菜单 ...

  3. Python爬取qq空间说说

    #coding:utf-8 #!/usr/bin/python3 from selenium import webdriver import time import re import importl ...

  4. flask 第七章 简陋版智能玩具 +MongoDB初识和基本操作

    1.简陋版web智能玩具 FAQ.py文件 import os from aip import AipSpeech, AipNlp from uuid import uuid4 "" ...

  5. layui在open弹出层回显,解决动态select数据回显问题

    //监听数据表格工具条         table.on('tool(contentList)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 l ...

  6. Visual Assist X 中使用doxygen的模板注释

    http://blog.csdn.net/dhifnoju/article/details/44947213 Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C+ ...

  7. equals方法中变量在前和在后的区别

    对于变量:String str1; 使用str1.equals("null"); 对于变量str1,如果str1是null,空是没有equals方法的,会抛出空指针异常 使用&qu ...

  8. 第一个jQuery

    第一个jQuery <script src = "jquery.js"> $(document).ready(function){ alert("Hello ...

  9. .NET界面控件DevExpress发布v18.2.8|附下载

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  10. Zabbix增加邮箱后Server宕处理

    zabbix版本:4.1  DB为Mysql 过程: 1,为了增加邮件报警功能,按照网上文章,开始增加发送邮件模块.先停postfix,后安装mailx和sendmail. systemctl lis ...