zoukankan      html  css  js  c++  java
  • 我的Python升级打怪之路【六】:面向对象(二)

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

    一、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  传入一个调用者不期望的值,即使值的类型是正确的
     1 ArithmeticError
     2 AssertionError
     3 AttributeError
     4 BaseException
     5 BufferError
     6 BytesWarning
     7 DeprecationWarning
     8 EnvironmentError
     9 EOFError
    10 Exception
    11 FloatingPointError
    12 FutureWarning
    13 GeneratorExit
    14 ImportError
    15 ImportWarning
    16 IndentationError
    17 IndexError
    18 IOError
    19 KeyboardInterrupt
    20 KeyError
    21 LookupError
    22 MemoryError
    23 NameError
    24 NotImplementedError
    25 OSError
    26 OverflowError
    27 PendingDeprecationWarning
    28 ReferenceError
    29 RuntimeError
    30 RuntimeWarning
    31 StandardError
    32 StopIteration
    33 SyntaxError
    34 SyntaxWarning
    35 SystemError
    36 SystemExit
    37 TabError
    38 TypeError
    39 UnboundLocalError
    40 UnicodeDecodeError
    41 UnicodeEncodeError
    42 UnicodeError
    43 UnicodeTranslateError
    44 UnicodeWarning
    45 UserWarning
    46 ValueError
    47 Warning
    48 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')
     1 from wsgiref.simple_server import make_server
     2 
     3 class Handler(object):
     4     
     5     def index(self):
     6         return "index"
     7 
     8     def news(self):
     9         return "news"
    10 
    11 
    12 def Runserver(environ,start_response):
    13     start_response("200 OK",[('Content-Type','text/html')])
    14     url = environ['PATH_INFO']
    15     temp = url.split('/')[1]
    16     obj = Handler()
    17     is_exist = hasattr(obj,temp)
    18     if is_exist:
    19         func = getattr(obj,temp)
    20         ret = func()
    21         return ret
    22     else:
    23         return "404"
    24 
    25 if __name__ == "__main__":
    26     httpd = make_server('',8080,Runserver)
    27     print('HttpServer on port 8080.....')
    28     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()
    通过面向对象的方式来创建实例

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

  • 相关阅读:
    javascript数据类型转换
    javascript运算符
    数据类型
    第一个JavaScript代码
    Javascript简介
    z-index
    Java代码优化
    Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
    java中继承条件下构造方法的执行过程
    java中的继承、重载和覆盖是什么意思
  • 原文地址:https://www.cnblogs.com/smiling-crying/p/9216111.html
Copyright © 2011-2022 走看看