面向对象的一些相关知识点

一、isinstance(obj,cls)

  检查实例obj是否是类cls的对象

class Foo(object):
pass obj = Foo() isinstance(obj,Foo)

二、issubclass(sub,super)

  检查sub类是否是super类的派生类

class Foo(object):
pass class F(Foo):
pass issubclass(F,Foo)

三、异常处理

在程序执行的过程中,不可避免的会出现一些错误,有些错误出现时,我们需要让他抛出,但是有些错误出现时我们会将他捕获,但却并不去终止程序的运行。

try:
pass
except Exception as e:
pass

经常见到的一些异常,掉过的坑.......

AttributeError 试图访问一个对象没有的属性
IOError 输入输出的错误,或许是无法打开文件
ImportError 无法引入模块和包,看看你的路径有没有问题
IndentationError 语法错误(的子类);代码没有正确对齐
IndexError 下标索引超出序列边界
KeyError 试图访问字典中不存在的键
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(代码有问题)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
 ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多异常

你再捕获异常的时候,可以选择性的捕获,也可以就像之上的例子一样捕获所有的异常

try:
pass
except ValueError as e: #只捕获ValueError异常
print(e)

异常捕获的其他的比较全面的写法

try:
#主代码块,需要检测是否有异常的代码块
pass
except KeyError as e:
#异常时,执行这个代码块
pass
else:
#主代码执行完后,执行这个代码块
pass
finally:
#无论异常与否,最终执行这个代码块
pass

主动触发异常

try:
raise Exception("主动抛出的异常......")
except Exception as e:
print(e)

自定义异常

class ErrorMyself(Exception):

    def __init__(self,msg):
self.message = msg def __str__(self):
return self.message try:
raise ErrorMyself('这是一个自定义异常')
except ErrorMyself as e:
print(e)

断言

assert 1 == 1

assert 1 == 2 #我就是要让1等于2

四、反射

  • hasattr  检查是否含有某成员
  • getattr   获取某成员
  • setattr   设置某成员
  • delattr   删除某成员
class Foo(object):

    def __init__(self):
self.name = 'null' def func(self):
return 'nullnull' obj = Foo() #检查
hasattr(obj,'name')
hasattr(obj,'func') #获取成员
getattr(obj,'name')
getattr(obj,'func') #设置成员
setattr(obj,'age',66)
setattr(obj,'show',lambda num:num+1) #删除成员
delattr(obj,'name')
delattr(obj,'func')
 from wsgiref.simple_server import make_server

 class Handler(object):

     def index(self):
return "index" def news(self):
return "news" def Runserver(environ,start_response):
start_response("200 OK",[('Content-Type','text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
obj = Handler()
is_exist = hasattr(obj,temp)
if is_exist:
func = getattr(obj,temp)
ret = func()
return ret
else:
return "" if __name__ == "__main__":
httpd = make_server('',8080,Runserver)
print('HttpServer on port 8080.....')
httpd.serve_forever()

一个关于反射用法的例子-web

import sys

def func1():
print('这里是func1') def func2():
print('这里是func2') this_module = sys.modules[__name__] hasattr(this_module,'func1')
getattr(this_module,'func2')

一个取当前的模块的成员的例子

注意:反射就是通过一个字符串操作对象的相关成员

也就是说,还可以操作类,操作模块,方法都一样,这里就不再一一赘述

设计模式

单例:单个实例

补充:再讲面向对象中的__new__方法时,提到使用__new__方法实现单例

应用场景:(这次来一个情景模拟吧)

现在我有一个类,专门用来去连接数据库使用的。

但是,如果,我来一个请求实例化一个对象,连接一次数据库,对服务器,对数据库的压力都是很大的。

这个时候,我特别的希望,能都只再第一次的时候进行一个实例化,以后每一次操作都是去调用这样的同一个实例化对象。

这不就是单例了?

单例模式用来保证内存中仅存在一个实例........

class Foo(object):

    _instance = None

    @staticmethod
def singleton():
if Foo._instance:
return Foo._instance else:
Foo._instance = Foo()
return Foo._instance obj = Foo.singleton()

通过面向对象的方式来创建实例

单例模式保证的时当前内存当中仅有一个实例,依此来避免内存的浪费.......

我的Python升级打怪之路【六】:面向对象(二)的更多相关文章

  1. 我的Python升级打怪之路【六】:面向对象(一)

    面向对象的概述 面向过程:根据业务逻辑从上到下写代码 函数式:将其功能代码封装到函数中,日后便无需编写,仅仅调用即可 [执行函数] 面向对象:对函数进行分类和封装.[创建对象]==>[通过对象执 ...

  2. 我的Python升级打怪之路【五】:Python模块

    模块,是一些代码实现了某个功能的集合 模块的分类: 自定义模块 第三方模块 内置模块 导入模块 import module from module.xx.xx import xx from modul ...

  3. 我的Python升级打怪之路【一】:python的简单认识

    Python的简介 Python与其他语言的对比: C和Python.Java.C# C语言:代码直接编译成了机器码,在处理器上直接执行 Python.Java.C#:编译得到相应的字节码,虚拟机执行 ...

  4. 我的Python升级打怪之路【七】:网络编程

    Socket网络套接字 socket通常也称为"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字“向网络发出请求或者应答网络请求. socket起源于 ...

  5. 我的Python升级打怪之路【四】:Python之前的一些补充

    字符串的格式化 1.百分号的方式 %[(name)][flags][width].[precision]typecode (name) 可选,用于选择指定的key flags 可选,可供选择的值有: ...

  6. 我的Python升级打怪之路【三】:Python函数

    函数 在函数之前,我们一直遵循者:面向过程编程,即:根据业务逻辑从上到下实现功能,开发过程中最常见的就是粘贴复制.代码就没有重复利用率. 例如:有好多的重复的代码 if 条件: 发送指令 接收结果 e ...

  7. 我的Python升级打怪之路【二】:Python的基本数据类型及操作

    基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数是32位,取值范围是-2**31~2--31-1 在64位系统上,整数的位数是64位,取值范围是-2**63~2**63-1 clas ...

  8. gitlab 迁移、升级打怪之路:8.8.5--> 8.10.8 --> 8.17.8 --> 9.5.9 --> 10.1.4 --> 10.2.5

    gitlab 迁移.升级打怪之路:8.8.5--> 8.10.8 --> 8.17.8 --> 9.5.9 --> 10.1.4 --> 10.2.5 gitlab 数据 ...

  9. Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__

    参考:slots NOTE 1.动态语言灵活绑定属性及方法. #!/usr/bin/env python3 class MyClass(object): def __init__(self): pas ...

随机推荐

  1. 常见的MIME

    "css": "text/css", "gif": "image/gif", "html": &qu ...

  2. winform 中TextBox只能输入数字

    textBox1.KeyPress+=TextNumber_KeyPress; private void TextNumber_KeyPress(object sender, KeyPressEven ...

  3. MIPS rev.1 指令参数

    由于MIPS各个版本之间的操作数会变,如果出现无法识别的情况 需要根据官方的MIPS instruction手册逐条核对,此处的版本为Rev.1 //******MIPS-55*********// ...

  4. Arduino I2C + AC24C32 EEPROM

    主要特性 AC24C32是Atmel的两线制串行EEPROM芯片,根据工作电压的不同,有-2.7.-1.8两种类型.主要特性有: 工作范围:-2.7类型范围4.5~5.5V,-1.8类型1.8~5.5 ...

  5. C#多线程学习(四) 多线程的自动管理(线程池)

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  6. CLR via C# 读书笔记-21.托管堆和垃圾回收

    前言 近段时间工作需要用到了这块知识,遂加急补了一下基础,CLR中这一章节反复看了好多遍,得知一二,便记录下来,给自己做一个学习记录,也希望不对地方能够得到补充指点. 1,.托管代码和非托管代码的区别 ...

  7. Linux中Consul集群部署

    分配三台虚拟机: 192.168.5.125 192.168.5.128 192.168.5.129 在每台虚拟机上创建  /usr/consul 文件件  命令: mkdir /usr/consul ...

  8. POJ 3522 最小差值生成树(LCT)

    题目大意:给出一个n个节点的图,求最大边权值减去最小边权值最小的生成树. 题解 Flash Hu大佬一如既往地强 先把边从小到大排序 然后依次加入每一条边 如果已经连通就把路径上权值最小的边删去 然后 ...

  9. PHP中implode()和explode()

    1, implode()函数返回由数组元素组合成的字符串,函数语法:string implode(separator,array),separator参数可选,规定数组元素之间放置的内容,默认是空字符 ...

  10. Connection Timeout和Command Timeout

    每次对数据库连接时,我们有时候会碰到连接超时或者命令超时,这两个超时是不一样的.以ADO.NET为例,当客户端和服务器端连接时,碰到的超时情况主要有下面几种: 当从连接池获取一个连接时,碰到超时. 当 ...