6 错误和异常

while True:
try:
x = int(input("Please enter a number: "))
break
except ValueError:
print("Oops! That was no valid number. Try again...")

try 语句的工作原理如下。

  • 首先,执行 try 子句tryexcept 关键字之间的(多行)语句)。
  • 如果没有异常发生,则跳过 except 子句 并完成 try 语句的执行。
  • 如果在执行try 子句时发生了异常,则跳过该子句中剩下的部分。然后,如果异常的类型和 except 关键字后面的异常匹配,则执行 except 子句 ,然后继续执行 try 语句之后的代码。
  • 如果发生的异常和 except 子句中指定的异常不匹配,则将其传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常,执行将停止并显示如上所示的消息。

try 语句有另一个可选子句,用于定义必须在所有情况下执行的清理操作。例如:

>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
...
Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 2, in <module>

finally 子句在任何情况下都会被执行。

7 类

7.1 作用域

global 语句可被用来表明特定变量生存于全局作用域并且应当在其中被重新绑定;nonlocal 语句表明特定变量生存于外层作用域中并且应当在其中被重新绑定。

请注意 局部 赋值(这是默认状态)不会改变 scope_testspam 的绑定。 nonlocal 赋值会改变 scope_testspam 的绑定,而 global 赋值会改变模块层级的绑定。

您还可以在 global 赋值之前看到之前没有 spam 的绑定。

7.2 类定义

最简单的类定义看起来像这样:

class ClassName:
<statement-1>
.
.
.
<statement-N>

类定义与函数定义 (def 语句) 一样必须被执行才会起作用。 (你可以尝试将类定义放在 if 语句的一个分支或是函数的内部。)

7.3 类对象

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

属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name。 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称。 因此,如果类定义是这样的:

class MyClass:
"""A simple example class"""
i = 12345 def f(self):
return 'hello world'

那么 MyClass.iMyClass.f 就是有效的属性引用,将分别返回一个整数和一个函数对象。

7.3.1 实例对象

实例对象的有效方法名称依赖于其所属的类。 根据定义,一个类中所有是函数对象的属性都是定义了其实例的相应方法。 因此在我们的示例中,x.f 是有效的方法引用,因为 MyClass.f 是一个函数,而 x.i 不是方法,因为 MyClass.i 不是一个函数。 但是 x.fMyClass.f 并不是一回事 --- 它是一个 方法对象,不是函数对象。

7.3.2 方法对象

通常,方法在绑定后立即被调用:

x.f()

MyClass 示例中,这将返回字符串 'hello world'。 但是,立即调用一个方法并不是必须的: x.f 是一个方法对象,它可以被保存起来以后再调用。 例如:

xf = x.f
while True:
print(xf())

将继续打印 hello world,直到结束。

方法的特殊之处就在于实例对象会作为函数的第一个参数被传入。 在我们的示例中,调用 x.f() 其实就相当于 MyClass.f(x)

7.4 类和实例变量

一般来说,实例变量用于每个实例的唯一数据,而类变量用于类的所有实例共享的属性和方法:

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
self.name = name # instance variable unique to each instance >>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # shared by all dogs
'canine'
>>> e.kind # shared by all dogs
'canine'
>>> d.name # unique to d
'Fido'
>>> e.name # unique to e
'Buddy'

7.5 类补充说明

方法的第一个参数常常被命名为 self。 这也不过就是一个约定: self 这一名称在 Python 中绝对没有特殊含义

7.6 类的继承

通过继承创建的新类称为子类派生类,被继承的类称为基类父类超类

继承语法

class 派生类名(基类名)
...

在python中继承中的一些特点:

  • 1、如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。
  • 2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
  • 3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

最新文章

  1. Django--自定义用户认证
  2. Selenium_等待页面加载完毕
  3. 2016huasacm暑假集训训练五 J - Max Sum
  4. MyBatis入门学习教程-调用存储过程
  5. PAT-乙级-1047. 编程团体赛(20)
  6. 遍历datatable的几种方法【转载】
  7. jquery判断checkbox是否选中
  8. handsontable的单元格操作方法
  9. Afianl加载网络图片(延续)
  10. Andio Studio
  11. js预编译
  12. (中等) HDU 1043 Eight,经典搜索问题。
  13. css基础详解(1)
  14. Python uwsgi 无法安装以及编译报错的处理方式
  15. 用ajax的同步请求解决登陆注册需要根据服务器返回数据判断是否能提交的问题
  16. 9.python面向对象编程
  17. java int数组任何数之间间隔不能对于指定数,内付极速排序
  18. windows下QT打包
  19. vue-resource+element upload上传(遇到formData总是变为object格式)
  20. 不使用循环或递归判断一个数是否为3的幂(leetcode 326)

热门文章

  1. 架构发展史Spring Cloud
  2. hdu1527
  3. grant
  4. Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证
  5. matlab保存数据
  6. LeetCode简单算法之删除链表中的节点 #237
  7. spring boot 源码解析11-ConfigurationClassPostProcessor类加载解析
  8. 第15章 RMAN备份 ​
  9. CString转const char
  10. 同一浏览器中同一JavaWeb程序不共享session方法