面向对象的一些相关知识点
一, 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 "404"
- 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()
通过面向对象的方式来创建实例
单例模式保证的时当前内存当中仅有一个实例, 依此来避免内存的浪费.......
来源: http://www.bubuko.com/infodetail-2655532.html