zoukankan      html  css  js  c++  java
  • 面向对象(进阶篇)、异常处理、单例模式

    类的成员

    类的成员分为三大类:

      1,字段 静态字段(每个对象都有一份时用)、普通字段(每个对象都不的数据时用)

      2,方法 静态方法(无需使用对象封装的内容)、类方法、普通方法(使用对象中的数据)

      3,特性 普通特性(将方法伪造成字段)

    通过类访问:静态字段、静态方法、类方法

    通过对象访问:普通字段、普通方法,类方法

     1 class Provice:
     2     #静态字段:在类中;在内存中只保存一份
     3     country = "中国"
     4 
     5 
     6 
     7     def __init__(self,name):
     8         temp = "xxx"
     9         #普通字段,在对象中;在每个对象中都要保存一份
    10         self.name = name
    11 
    12     #普通方法,类中
    13     def show(self):
    14         print('show')
    15 
    16     #类方法
    17     @classmethod
    18     def xxoo(cls):  #类名
    19         print('xxoo')
    20         # print('xxoo',cls)
    21 
    22     #静态方法
    23     @staticmethod
    24     def xo(arg1,arg2):
    25             print('xo')
    26 
    27     def start(self):
    28         temp = "%s sb" %self.name
    29         return temp
    30 
    31     #特性,将方法伪造成一种字段
    32     @property
    33     def end1(self):
    34         temp = "%s sb" % self.name
    35         return temp
    36 
    37     @end1.setter  #类名+setter 修改参数
    38     def end1(self,value):
    39 
    40         # print(value)
    41         self.name = value
    42 
    43 obj = Provice("123")
    44 print(obj.end1)
    45 obj.end1 = "456"
    46 print(obj.end1)
    47 
    48 obj = Provice('alex')
    49 print(obj.end1)
    50 obj.end1 = "123"
    51 print(obj.end1)
    52 
    53 
    54 obj = Provice('alex')
    55 #print(obj.name)
    56 ret1 = obj.start()
    57 ret2 = obj.end1
    58 print(ret1)
    59 Provice.xo(1,2)  #执行静态方法
    60 Provice.xxoo()   #执行类方法
    61 hebei = Provice("河北")
    62 henan = Provice("河南")
    63 #1,自己去访问自己的成员
    64 #2,除了类中的方法
    65 
    66 print(Provice.country)
    67 obj = Provice('alex')
    68 obj.show()

    总结:

    快速判断,是类执行还是对象执行:

      1,有self  对象执行

      2,无self  类调用

    调用方法:

      普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;

      类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;

      静态方法:由类调用;无默认参数;

    特性:

      定义时,普通方法的基础上添加 @property

      定义时,属性仅有一个self参数

      调用时,无需括号

     成员修饰符

    公共成员,在任何地方都能访问

    私有成员,只有在类的内部才能访问;私有成员命名,前两个字符使下划线(特殊成员除外)。

    1,静态字段

    a,公有静态字段:类可以访问;类内部可以访问;派生类中可以访问

    实例:

     1 class C:
     2 
     3     name = "hello"
     4 
     5     def func(self):
     6         print(C.name)
     7 
     8 class D(C):
     9 
    10     def show(self):
    11         print(C.name)
    12 
    13 
    14 C.name         # 类访问
    15 
    16 obj = C()
    17 obj.func()     # 类内部可以访问
    18 
    19 obj_son = D()
    20 obj_son.show() # 派生类中可以访问
    公有静态字段

    b,私有静态字段:仅类内部可以访问;

    实例:

    1 class Foo:
    2     # xo = "xo"
    3     __ox = "ox"  #只能被内部取到,不能被外部取到
    4     def fetch(self):
    5         print(Foo.__ox)
    6 #
    7 obj = Foo()
    8 obj.fetch()
    私有静态字段

    2,普通字段

    公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问

     1 class C:
     2 
     3     def __init__(self):
     4         self.foo = "公有字段"
     5 
     6     def func(self):
     7         print(self.foo)  #类内部访问
     8 
     9 class D(C):
    10 
    11     def show(self):
    12         print(self.foo) # 派生类中访问
    13 
    14 obj = C()
    15 
    16 obj.foo     # 通过对象访问
    17 obj.func()  # 类内部访问
    18 
    19 obj_son = D()
    20 obj_son.show()  # 派生类中访问
    公有普通字段

    私有普通字段:仅类内部可以访问

     1 class C:
     2 
     3     def __init__(self):
     4         self.__foo = "私有字段"
     5 
     6     def func(self):
     7         print(self.foo)#类内部访问
     8 
     9 class D(C):
    10 
    11     def show(self):
    12         print(self.foo)#派生类中访问
    13 
    14 obj = C()
    15 
    16 obj.__foo     # 通过对象访问    ==> 错误
    17 obj.func()  # 类内部访问        ==> 正确
    18 
    19 obj_son = D()
    20 obj_son.show()  # 派生类中访问  ==> 错误
    私有普通字段

    类的特殊成员

    1,__init__

    构造方法,通过类创建对象时,自动触发执行。

     1 class Annimal:
     2     def __init__(self):
     3         print('A构造方法')
     4         self.ty = "动物"
     5 
     6 class Cat(Annimal):
     7     def __init__(self):
     8         print('B构造方法')
     9         self.n = ""
    10 
    11         super(Cat,self).__init__()  #super().__init__()执行父类的构造方法
    12         #Annimal.__init__(self)  #这样也行,但不推荐
    13 
    14 #类后面加括号自动执行
    15 #数据初始化
    16 c = Cat()
    17 print(c.__dict__)

    2,__del__

    析构方法,当对象在内存中被释放时,自动触发执行

    class Foo:
    
        def __del__(self):
            pass

     

    3,__call__

    对象后面加括号,触发执行。

    1 class Foo:
    2     def __init__(self):  #构造方法,通过类创建对象,自动触发执行
    3         print('init')
    4     def __call__(self, *args, **kwargs):  #对象加括号,触发执行
    5         print('call')
    6         return 1
    7 
    8 r = Foo()()  #对象后面加括号,触发执行
    9 print(r)

    4,__getitem__、__setitem__、__delitem__

    该三个方法用于分片操作

    用于索引操作,如字典。以上分别表示获取、设置、删除数据

     1 class Foo:
     2     def __getitem__(self, item):  #获取
     3         print(item)
     4 
     5     def __setitem__(self, key, value):  #设置
     6         print(key,value)
     7 
     8     def __delitem__(self, key):  #删除
     9         print(key)
    10 
    11 r = Foo()             #__init__
    12 
    13 r['sdkjfwien']       #__getitem__
    14 r['hh'] = 123         #__setitem__
    15 del r['hhgdajjfada'] #__delitem__
    16 print(Foo.__dict__)  #__dict__  获取类或对象中的所有成员

    5,__getslice__、__setslice__、__delslice__

    用于分片操作

     1 class Foo(object):
     2 
     3     def __getslice__(self, i, j):
     4         print ('__getslice__',i,j)
     5 
     6     def __setslice__(self, i, j, sequence):
     7         print ('__setslice__',i,j)
     8 
     9     def __delslice__(self, i, j):
    10         print ('__delslice__',i,j)
    11 
    12 obj = Foo()
    13 
    14 obj[0:1]                  # 自动触发执行 __getslice__
    15 obj[0:1] = [11,22,33,44]    # 自动触发执行 __setslice__
    16 del obj[0:2]               # 自动触发执行 __delslice__

     

    6,__dict__

    类或对象中的所有成员

     1 class Province:
     2 
     3     country = 'China'
     4 
     5     def __init__(self, name, count):
     6         self.name = name
     7         self.count = count
     8 
     9     def func(self, *args, **kwargs):
    10         print 'func'
    11 
    12 # 获取类的成员,即:静态字段、方法、
    13 print Province.__dict__
    14 # 输出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}
    15 
    16 obj1 = Province('HeBei',10000)
    17 print obj1.__dict__
    18 # 获取 对象obj1 的成员
    19 # 输出:{'count': 10000, 'name': 'HeBei'}
    20 
    21 obj2 = Province('HeNan', 3888)
    22 print obj2.__dict__
    23 # 获取 对象obj1 的成员
    24 # 输出:{'count': 3888, 'name': 'HeNan'}
    View Code

    7,__doc__

    表示类的描述信息

    class Foo:
        """
        这个类的注释
    
         """
    
        def func(self):
            pass
    
    print Foo.__doc__
    #输出:类的描述信息

    8,__module__ 和  __class__ 

    __module__ 表示当前操作的对象在那个模块

    __class__     表示当前操作的对象的类是什么

    class C:
    
        def __init__(self):
            self.name = 'wupeiqi'
    from lib.aa import C
    
    obj = C()
    print obj.__module__  # 输出 lib.aa,即:输出模块
    print obj.__class__      # 输出 lib.aa.C,即:输出类
    
    index.py

    9,__str__

    如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值

    class Foo:
    
        def __str__(self):
            return 'hello'
    
    
    obj = Foo()
    print obj
    # 输出:hello

    异常处理

    1,异常基础

    try:
        pass
    except Exception,ex:
        pass

    需求:将用户输入的两个数字相加

    while True:
        num1 = input('num1:')
        num2 = input('num2:')
        try:
            num1 = int(num1)
            num2 = int(num2)
            result = num1 + num2
        except Exception as e:
            print ('出现异常,信息如下:')
            print (e)
    View Code

    2,异常种类

     1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
     2 IOError 输入/输出异常;基本上是无法打开文件
     3 ImportError 无法引入模块或包;基本上是路径问题或名称错误
     4 IndentationError 语法错误(的子类) ;代码没有正确对齐
     5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
     6 KeyError 试图访问字典里不存在的键
     7 KeyboardInterrupt Ctrl+C被按下
     8 NameError 使用一个还未被赋予对象的变量
     9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    10 TypeError 传入对象类型与要求的不符合
    11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    12 导致你以为正在访问它
    13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    14 
    15 常用异常
    常见异常
    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
    更多异常

    实例:

    dic = ["wupeiqi", 'alex']
    try:
        dic[10]
    except IndexError as e:
        print(e)
    IndexError
    dic = {'k1':'v1'}
    try:
        dic['k20']
    except KeyError as e:
        print(e)
    KeyError
    s1 = 'hello'
    try:
        int(s1)
    except ValueError as e:
        print(e)
    ValueError

    万能异常是Exception,他可以捕获任意异常

    s1 = 'hello'
    try:
        int(s1)
    except Exception,e:
        print e

    对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序正常运行

    s1 = 'hello'
    try:
        int(s1)
    except KeyError as e:
        print('键错误')
    except IndexError as e:
        print('索引错误')
    except Exception as e:
        print('错误')

    3,异常其他结构

    try:
        # 主代码块
        pass
    except KeyError,e:
        # 异常时,执行该块
        pass
    else:
        # 主代码块执行完,执行该块
        pass
    finally:
        # 无论异常与否,最终执行该块
        pass

    4,主动触发异常

    try:
        raise Exception('错误了。。。')
    except Exception as e:
      #封装了错误信息的对象
    print(e)

    5,自定义异常

    1 class Foo:
    2     def __init__(self,arg):
    3         self.xo = arg
    4 
    5     def __str__(self):
    6         return self.xo
    7 obj = Foo('出错了...')
    8 print(obj)

    &

     1 class WupeiqiException(Exception):
     2  
     3     def __init__(self, msg):
     4         self.message = msg
     5  
     6     def __str__(self):
     7         return self.message
     8  
     9 try:
    10     raise WupeiqiException('我的异常')
    11 except WupeiqiException,e:
    12     print e

    6,断言

    1 # assert 条件
    2  
    3 assert 1 == 1
    4  
    5 assert 1 == 2

     单例模式

    单例,顾名思义单个实例

    实例:

    面向对象场景一:

    class ConnectionPool:
    
        __instance = None
    
        def __init__(self):
            self.ip = "1.1.1.1"
            self.port = 3306
            self.pwd = "123123"
            self.username = 'xxxx'
            #去连接
            self.conn__list = [1,2,3,4,5,6,7,8,9,10]
    
        @staticmethod
        def get_instance():
            if ConnectionPool.__instance:
                return ConnectionPool.__instance
            else:
                #创建一个对象,并将对象赋值给静态字段__instance
                ConnectionPool.__instance = ConnectionPool()
                return ConnectionPool.__instance
    
    obj1 = ConnectionPool.get_instance()
    print(obj1)
    obj2 = ConnectionPool.get_instance()
    print(obj2)
    obj3 = ConnectionPool.get_instance()
    print(obj3)

    面向对象场景二:

    如:创建对数据库操作的公共类

    # #### 定义类 ####
    
    class DbHelper(object):
    
        def __init__(self):
            self.hostname = '1.1.1.1'
            self.port = 3306
            self.password = 'pwd'
            self.username = 'root'
    
        def fetch(self):
            # 连接数据库
            # 拼接sql语句
            # 操作
            pass
    
        def create(self):
            # 连接数据库
            # 拼接sql语句
            # 操作
            pass
    
        def remove(self):
            # 连接数据库
            # 拼接sql语句
            # 操作
            pass
    
        def modify(self):
            # 连接数据库
            # 拼接sql语句
            # 操作
            pass
    
    # #### 操作类 ####
    
    db = DbHelper()
    db.create()

    实例:结合场景二实现Web应用程序

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from wsgiref.simple_server import make_server
    
    class ConnectionPool:
    
        __instance = None
    
        def __init__(self):
            self.ip = "1.1.1.1"
            self.port = 3306
            self.pwd = "123123"
            self.username = 'xxxx'
            # 去连接
            self.conn_list = [1,2,3,4,5,6,7,8,9, 10]
    
        @staticmethod
        def get_instance():
            if ConnectionPool.__instance:
                return ConnectionPool.__instance
            else:
                # 创建一个对象,并将对象赋值给静态字段 __instance
                ConnectionPool.__instance = ConnectionPool()
                return ConnectionPool.__instance
    
        def get_connection(self):
            # 获取连接
            import random
            r = random.randrange(1,11)
            return r
    
    def index():
        # p = ConnectionPool()
        # print(p)
        p = ConnectionPool.get_instance()
        conn = p.get_connection()
        return "iiiiiii" + str(conn)
    
    def news():
        return 'nnnnnnn'
    
    def RunServer(environ, start_response):
        start_response(status='200 OK', headers=[('Content-Type', 'text/html')])
    
        url = environ['PATH_INFO']
        if url.endswith('index'):
            ret = index()
            return ret
        elif url.endswith('news'):
            ret = news()
            return ret
        else:
            return "404"
    
    
    if __name__ == '__main__':
        httpd = make_server('', 8008, RunServer)
        print("Serving HTTP on port 8008...")
        httpd.serve_forever()

    详细参考:http://www.cnblogs.com/wupeiqi/articles/5017742.html

         http://www.cnblogs.com/wupeiqi/p/4766801.html

  • 相关阅读:
    功能强大表格控件Spread for Windows Forms 中文版发布
    charles 证书在 andriod 7 及更高版本手机上的安装
    Hibernate 开发中问题
    Silverlight中DataForm对数据进行校验
    LightSpeed ORM .NET简单运用
    Hibernate manytomany实现
    C# _lopen判断文件是否正在被使用
    SQL Join
    Castle与Mixin
    Catalysis 的构成部分与框架
  • 原文地址:https://www.cnblogs.com/kongqi816-boke/p/5556723.html
Copyright © 2011-2022 走看看