面向对象多继承 异常处理

总结
1 多继承
2封装,多态  :比如定义一个变量  a=  这里a可以赋值多种类型比如字典列表,字符串等  Python 本身就是默认多态的
3 super()方法
4 类的约束
5 异常处理

多继承的顺序 和 super()方法

‘‘‘
class A:
    def func1(self):
        # super().func()
        print(self,‘A‘)
class B():
    def func(self):
        super().func()

        print(self,‘这是B‘)
class C():
    def func(self):
        # super().func()
        print(self,‘这是C‘)
class D(B,C):   #当你执行这个func方法时 先走B,B走完后,如果B里边没有super 就不会跳到下一步去在找C,
    def func(self):
        super().func()
        #super这个位置括号里边其实是super(B,self)
        # 第一个参数是类,第二个是参数self 那个对象调用的就是那个对象的内存地址,
        #若不是B,改为C的话直接跳到C这个位置,就不走B了
        print(self,‘这是D‘)
python中类的分类:
python2x版本:
    python2.2之前,只有经典类,python2.2之后出现了新式类.
    经典类: 不继承object类. 多继承遵循深度优先.
        class A:
            pass
    新式类: 继承object的类. 多继承遵循c3算法,mro方法.
        class A(object):
            pass

python3x版本: 所有类都默认继承object.
    只有新式类.

‘‘‘
深度优先: 从左至右,一条路走到底.

新式类的多继承: C3算法.
‘‘‘
class O:
    pass

class D(O):
    pass

class E(O):
    pass

class F(O):
    pass

class B(D,E):
    pass

class C(E,F):
    pass

class A(B,C):
    pass

obj = A()
print(A.mro())

mro(C(A,B)) = [C] + merge(mro(A),mro(B),[A,B])
mro(B(A)) = [B,A]
mro(B(A1,A2,A3)) = [B] + merge(mro(A1),mro(A2),mro(A3),[A1,A2,A3])
[A,B,C] 表头:A 表尾: B,C
[A] 表头: A ,表尾: 空.
[A] + [B] = [A,B]
# 如果计算merge里面的顺序:
merge([A,O], [C,E,F,O],[C])
# [A] + merge([O], [C,E,F,O],[C])
# [A,C] + merge([O], [E,F,O])

A.mro(B,C)=[A] + merge(mro(B),mro(C),[B,C])
A.mro(B,C)=[A] + merge([B,D,E,O],[C,E,F,O],[B,C])
[A,B,D,C,E,F,O]
mro(B)=B.mro(D,E)=[B] + merge(mro(D),mro(E),[D,E])
mro(D)=[D,O]
mro(E)=[E,O]
mro(B)=B.mro(D,E)=[B] + merge([D,O],[E,O],[D,E])  --[B,D,E,O]

mro(C)=C.mro(E,F)=[C] + merge(mro(E),mro(F),[E,F])
mro(E)=[E,O]
mro(F)=[F,O]
mro(C)=C.mro(E,F)=[C] + merge([E,O],[F,O],[E,F])--[C,E,F,O]
‘‘‘

4类的约束  强制我的子类必须有某种方法  .主动抛异常 rice 一下

方法一 主动抛异常 rice 一下 :归一化设计,在鸭式基础上去 添加.一个接口.把不同的类,相同方法 作为一个函数放调用
方法二 抽象类 接口类 : 制定一个规范,强制子类必须有pay方法,如果没有,在你实例化的时候就会报错.
 ‘第一种方式 :Python最常用的方式.
   列:
   class Payment:
       def pay(self,money):
           raise Exception (‘错误提示语句‘)
    class Alipay(Payment):
        def pay(self,money):
            print(‘你使用阿里支付了%s‘%money)
    class Wecahat(Payment):
        def pay(self,money):
            print(‘您使用了微信支付了%s‘%money)
    class QQpay(Payment):
        def pay(self,money):
            print(‘您使用了QQ支付了%s‘%money)
    def pay(obj,money):#统一了支付方式.归一化设计
        obj.pay(money)

方式 二:
from abc import ABCMeta,abstractclassmethod    #没有这个方法时子类是不可以生成对象的
class Payment(metaclass=ABCMeta):
        @abstractclassmethod
        def pay(self,money):
                pass
class Alipay(Payment):
    def pay(self,money):
        print(‘您是使用了啊里支付了%s‘%money)

    class Wechatpay(Payment):
        def pay(self, money):
            print(‘您用微信支付了%s元‘ % money)

    class Applepay(Payment):
        def pay(self, money):
            print(‘您用苹果支付了%s元‘ % money)

    def pay(obj, money):  # 统一了支付方式:归一化设计
        obj.pay(money)  # obj2.pay(200)

    #
# 5 异常处理
# 异常错误分类
    1.语法异常
        输入的代码错误
        直接飘红

    2.逻辑错误
        不会直接飘红
        但是,逻辑是错误的
        比如查索引的时候超过下标
        代码执行了后 才会出现的错误

如何处理这些逻辑错误.
异常错误信息
错误类型,
一,异常处理
    1.先捕捉
    2.在进行处理
二,异常处理的俩种方式
    if  预防
    用if处理异常劣势:
    1,对于相同的错误类型,你要用大量的重复代码处理异常.
    2,如果异常种类较多,利用if 你得代码会出现冗余(无用代码过多).

    try : except 异常处理,  代码异常报错,但是可以执行 expcet 下的代码

    1,
    单支
    try:   一个try
        pass
    except IndexError(错误类型 不定)  一个错误类型
    2.
    多支
    try:
        pass
        pass
     except IndexError as e:  可以接收对应的报错
        print(e)  可以打印,可不打印
    except KeyError as e:   可以接收对应的报错
        print(e)
    except ValueError as e:  可以接收对应的报错
        print(e)

    3.
    万能异常
    try  except   Exception

    try:
        pass
        pass
    except Exception:  可以接收多个错误类型   继续走下面代码
    pass
如果 你只想将异常处理掉,对错误信息不关心,用万能异常.
如果 你需要根据不同的错误信息而执行不同的逻辑(分流),那么用多分支,或者多分支加万能异常
    4,
    多分支 + 万能
    try  except else
      else : 如果出现异常,就不执行else 否则执行else语句.

    try:
        pass
        pass
    except ValueError:
        pass
    except Exception:
        pass
    else:
        pass

try except (else) finally
finally 出不出现异常都执行,异常出现前执行fianlly.
用途:
    1关闭文件句柄,关闭数据库链接.
    2 函数return之前能够执行finally代码.
    3, break之前可以执行finally.

    例题
        try:
            f = open(‘aaa‘, encoding=‘utf-8‘,mode=‘w‘)
            f.write(‘fdsafsd‘)
            # 文件件句柄操作的代码非常多
        except Exception:
            print(333)
        else:
            print(666)
        finally:
            # print(‘执行‘)
            f.close()

    7  raise 主动抛出异常
        raise IndexError(‘超出索引范围‘)
    8 assert   在源码中常出现   断言  表示一个强硬的态度,不满足条件直接报错

    9 自定义

原文地址:https://www.cnblogs.com/LMTlmt/p/10324830.html

时间: 2024-10-10 01:25:01

面向对象多继承 异常处理的相关文章

面向对象之继承

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 面向对象之继承 { class Program { static void Main(string[] args) { //记者:我是记者,我的爱好是偷拍,我的年龄34,我是一个男的 //程序员:我叫孙权 我的年龄23 我是男生 我的工作年限是3年

黑马程序员——Java基础---面向对象之继承

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流!                                                                 面向对象之继承  一:继承(extends) (1)继承的体系结构:就是对要描述的事物进行不断的向上抽取,就出现了体系结构.

javascript面向对象程序设计——继承初步(by vczero)

上一篇说了javascript的封装,没有刻意去说javascript的“共有函数”.“私有函数”,因为个人觉得这只是作用域的问题,我们不能刻意的模仿强类型语言(C++/JAVA)而去编写代码.尊重每一门语言的特性才是最为重要的. 一.基于prototype原型的继承 1 var Person = function(name, age){ 2 this.name = name; 3 this.age = age; 4 } 5 6 Person.prototype = { 7 addUser: f

C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员是派生类成员一样: Bulk_item bulk; cout << bulk.book() << endl; 名字book的使用将这样确定[先派生->后基类]: 1)bulk是Bulk_item类对象,在Bulk_item类中查找,找不到名

面向对象--多继承&amp;派生类对象内存布局分析&amp;各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一

【面向对象】继承(转载)

[面向对象]继承 1.继承 1)复用:开发只需要定义独有的功能(属性和方法),再复用曾经写过的功能(属性和方法) 2)extends:继承的关键字 格式:class 子类 extends 父类 3)子类可以继承父类的属性和方法 4)继承本质:把父类的属性和方法代码拷贝到子类中,在写子类代码时候,可以减少代码量,只需要添加新的部分 5)java中继承是单继承,但可以层层继承 单继承:子类只能有一个直接父类 案例: public class Demo2 { public static void ma

转 python语法学习面向对象之继承

传送门 python语法学习面向对象之继承 只要涉及到面向对象,”类“是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念: 包括初始化方法__init__,可以理解为构造,self,理解为this,等等在前一篇文章中介绍过,现在就学习类的继承. 继承: 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法   class 派生类

C++ Primer 学习笔记_69_面向对象编程 -继承景况下的类作用域

面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员是派生类成员一样: Bulk_item bulk; cout << bulk.book() << endl; 名字book的使用将这样确定[先派生->后基类]: 1)bulk是Bulk_item类对象,在Bulk_item类中查找,找不到名

轻松学习JavaScript十三:JavaScript基于面向对象之继承(包含面向对象继承机制)

一面相对象继承机制 今天算是什么都没干,尽在了解面向对象三大特性之一的继承了,过去的学习的C++和C#都是正统的面向对象语 言,学习的时候也没有怎么深入了解过,只是简单的学习最基础的继承.下午在看继承机制的时候,看到一个很经典 的继承机制实例.这个实例使用UML很好的解释了继承机制. 说明继承机制最简单的方式是,利用一个经典的例子就是几何形状.实际上,几何形状只有两种,即椭圆形(是圆 形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形.矩形和五边形都是多边形的一种, 具有