• Python学习笔记五之错误与异常处理、面向对象实例


    1.错误和异常

    1.1 异常处理try/except

    在这里插入图片描述

    while True:
        try:
            x=int(input("请输入一个数字:"))
            break
        except ValueError:
            print("您输入的不是数字,请再次尝试!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    for arg in sys.arg[1:]:
        try:
            f=open(arg,'r')
        except IOError:
            print('cannot open',arg)
        else:
            print(arg,'has',len(f.readlines()),'lines')
            f.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    try:
        runoob()
    except AssertionError as error:
        print(error)
    else:
        try:
            with open('file.log') as file:
                read_data=file.read()
            except FileNotFoundError as fnf_error:
                print(fnf_error)
    finally:
        print('这句话,无论异常是否都会执行.')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.2 抛出异常

    在这里插入图片描述

    x=10
    if x>5:
        raise Exception('x 不能大于 5, x的值为{}.format(x))
    *********************执行以上将触发******************************
    Traceback (most recent call last):
      File "test.py", line 3, in <module>
        raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
    Exception: x 不能大于 5。x 的值为: 10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.3 用户自定义异常

    class Error(Exception):
        """Base class for exceptions in this module."""
        pass
    
    class InputError(Error):
        """Exception raised for errors in the input.
    
        Attributes:
            expression -- input expression in which the error occurred
            message -- explanation of the error
        """
    
        def __init__(self, expression, message):
            self.expression = expression
            self.message = message
    
    class TransitionError(Error):
        """Raised when an operation attempts a state transition that's not
        allowed.
    
        Attributes:
            previous -- state at beginning of transition
            next -- attempted new state
            message -- explanation of why the specific transition is not allowed
        """
    
        def __init__(self, previous, next, message):
            self.previous = previous
            self.next = next
            self.message = message
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2.面向对象Class

    **面向对象技术简介**(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象
    是类的实例。
    方法:类中定义的函数。
    类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使
    用。
    数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
    方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),
    也称为方法的重写。
    局部变量:定义在方法中的变量,只作用于当前实例的类。
    实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变
    量。
    继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作
    为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关
    系。
    实例化:创建一个类的实例,类的具体对象。
    对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.1类对象

    #!/usr/bin/python3
     
    class MyClass:
        """一个简单的类实例"""
        i = 12345
        def f(self):
            return 'hello world'
     
    # 实例化类
    x = MyClass()
     
    # 访问类的属性和方法
    print("MyClass 类的属性 i 为:", x.i)
    print("MyClass 类的方法 f 输出为:", x.f())
    ******************************************************
    #output:
    MyClass 类的属性 i 为: 12345
    MyClass 类的方法 f 输出为: hello world
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.2 self代表类的实例,而非类

    类有一个名为 init() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:

    def __init__(self):
        self.data=[]
    
    • 1
    • 2

    类定义了 init() 方法,类的实例化操作会自动调用 init() 方法。如下实例化类 MyClass,对应的 init() 方法就会被调用:

    x=MyClass()
    
    • 1

    当然, init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上。例如:

    class Complex:
        def __init__(self,realpart,imagpart):
            self.r=realpasrt
            self.i=imagpart
    x=Complex(3.0,-4.5)
    print(x.r,x.i)
    #output
    3.0 -4.5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

    class Test:
        def prt(self):
            print(self)
            print(self.__class__)
     
    t = Test()
    t.prt()
    ******************************************
    #output:
    <__main__.Test instance at 0x100771878>
    __main__.Test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:

    class Test:
        def prt(runoob):
            print(runoob)
            print(runoob.__class__)
     
    t = Test()
    t.prt()
    **************************************************
    <__main__.Test instance at 0x100771878>
    __main__.Test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.3 类的方法

    #类定义
    class people:
        #定义基本属性
        name = ''
        age = 0
        #定义私有属性,私有属性在类外部无法直接进行访问
        __weight = 0
        #定义构造方法
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print("%s 说: 我 %d 岁。" %(self.name,self.age))
     
    # 实例化类
    p = people('runoob',10,30)
    p.speak()
    ******************output***********************************
    runoob 说:10 岁。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.4 继承

    #!/usr/bin/python3
     
    #类定义
    class people:
        #定义基本属性
        name = ''
        age = 0
        #定义私有属性,私有属性在类外部无法直接进行访问
        __weight = 0
        #定义构造方法
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print("%s 说: 我 %d 岁。" %(self.name,self.age))
     
    #单继承示例
    class student(people):
        grade = ''
        def __init__(self,n,a,w,g):
            #调用父类的构函
            people.__init__(self,n,a,w)
            self.grade = g
        #覆写父类的方法
        def speak(self):
            print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
     
    s = student('ken',10,60,3)
    s.speak()
    **********************************************************************************
    #output
    ken 说:10 岁了,我在读 3 年级
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.5 多继承

    #!/usr/bin/python3
     
    #类定义
    class people:
        #定义基本属性
        name = ''
        age = 0
        #定义私有属性,私有属性在类外部无法直接进行访问
        __weight = 0
        #定义构造方法
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print("%s 说: 我 %d 岁。" %(self.name,self.age))
     
    #单继承示例
    class student(people):
        grade = ''
        def __init__(self,n,a,w,g):
            #调用父类的构函
            people.__init__(self,n,a,w)
            self.grade = g
        #覆写父类的方法
        def speak(self):
            print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
     
    #另一个类,多重继承之前的准备
    class speaker():
        topic = ''
        name = ''
        def __init__(self,n,t):
            self.name = n
            self.topic = t
        def speak(self):
            print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
     
    #多重继承
    class sample(speaker,student):
        a =''
        def __init__(self,n,a,w,g,t):
            student.__init__(self,n,a,w,g)
            speaker.__init__(self,n,t)
     
    test = sample("Tim",25,80,4,"Python")
    test.speak()   #方法名同,默认调用的是在括号中参数位置排前父类的方法
    ************************************************************************************
    #output
    我叫 Tim,我是一个演说家,我演讲的主题是 Python
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    2.6 方法重写

    如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:

    class Parent:
        def myMethod(self):
            print('调用父类方法')
    class Child(Parent): # 定义子类
       def myMethod(self):
          print ('调用子类方法')
     
    c = Child()          # 子类实例
    c.myMethod()         # 子类调用重写方法
    super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
    ************************************************************************
    #output
    调用子类方法
    调用父类方法
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.7 类的私有属性

    __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

    #!/usr/bin/python3
     
    class JustCounter:
        __secretCount = 0  # 私有变量
        publicCount = 0    # 公开变量
     
        def count(self):
            self.__secretCount += 1
            self.publicCount += 1
            print (self.__secretCount)
     
    counter = JustCounter()
    counter.count()
    counter.count()
    print (counter.publicCount)
    print (counter.__secretCount)  # 报错,实例不能访问私有变量
    *****************************************************************
    #output
    1
    2
    2
    Traceback (most recent call last):
      File "test.py", line 16, in <module>
        print (counter.__secretCount)  # 报错,实例不能访问私有变量
    AttributeError: 'JustCounter' object has no attribute '__secretCount'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    类的专有方法:

    __init__ : 构造函数,在生成对象时调用
    __del__ : 析构函数,释放对象时使用
    __repr__ : 打印,转换
    __setitem__ : 按照索引赋值
    __getitem__: 按照索引获取值
    __len__: 获得长度
    __cmp__: 比较运算
    __call__: 函数调用
    __add__: 加运算
    __sub__: 减运算
    __mul__: 乘运算
    __truediv__: 除运算
    __mod__: 求余运算
    __pow__: 乘方
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.8 运算符重载:

    class Vector:
        def __init__(self,a,b):
            self.a=a
            self.b=b
        def __str__(self):
            return 'Vector (%d,%d)' % (self.a,self.b)
        def __add__(self,other):
            return Vector(self.a+other.a,self.b+other.b)
    v1=Vector(2,10)
    v2=Vector(5,-2)
    print(v1+v2)
    *********************************************************
    #output
    Vector(7,8)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    redis内存描述
    数据结构插入排序
    Pytest精通指南(26)钩子函数-依赖执行(pytest-dependency)
    AES加密有什么用,AES加密算法安全性如何
    软件开发项目文档系列之十五如何撰写项目结项报告
    LCD1602液晶显示屏介绍和程序开发
    Docker 入门,学明白这一篇就够啦
    ES6中Promise用法(封装Ajax)
    STL:string容器操作
    聊跨境:一年增长60%!人人都说跨境电商难做,但红利仍在(Starday)
  • 原文地址:https://blog.csdn.net/yohnyang/article/details/126007306