python3 面向对象编程,错误以及异常处理

类与实例

类是抽象的模板,实例是根据类创建出来的一个个具体的“对象”;

术语解释

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
方法:类中定义的函数。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法

定义类

class Student(object):
    pass
#类通常是以大写字母开头,object表示该类是从那个类继承下来的(如果最上面的类找不到继承直接写object即可)

类的初始化

(_ init )方法的第一个参数永远是self,表示创建的实例本身,因此,在 init _方法内部,就可以把各种属性绑定到self。

class Int:
    def __init__(self, a, b):  #self代表实例
        self.r = a
        self.i = b
x = Complex(3, 4)  #实例化对象是需要传递两个参数
print(x.r, x.i) 
输出结果:3 4

类对象

类对象支持两种操作:属性引用和实例化

#定义Student类:
class Student:
    id = 123
    def f(self):
        return 'hello world'

#实例化类
x = Student()

#访问类的属性和方法:
print("student的属性:",x.id)
print("student的方法:",x.f())
输出结果:
student的属性: 123
student的方法: hello world

类的方法

在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数:

class Student:
    #定义基本属性
    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('xiaoming',10,30)
p.speak()
输出结果:
xiaoming 说: 我 10 岁。

类的继承:单继承和多继承

class Student:
    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 people(Student):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        Student.__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,people):
    a =''
    def __init__(self,n,a,w,g,t):
        people.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
print(test.speak())   #方法名同,默认调用的是在括号中排前地父类的方法
输出结果:
我叫 Tim,我是一个演说家,我演讲的主题是 Python

类的专有方法

__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 乘方

错误和异常处理

Python有两种错误很容易辨认:语法错误和异常
在运行Python程序的时候,即便语法正确,也有可能发生错误。运行期检测到的错误被称为异常。

异常处理

try语句按照如下方式工作;
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

###一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行;
###except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组;
###try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行;

import sys
try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err: 
    print("OS error: {0}".format(err))
except (RuntimeError, TypeError, NameError):
    print("Could not convert data to an integer.")
else:
    print('ok !')
    f.close()

异常抛出

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类;

这里写代码片

重点内容

参考文章:
廖雪峰,菜鸟教程,w3cschool教程

猜你喜欢

转载自blog.csdn.net/weixin_39249306/article/details/81983287