1,?尝试一个新的函数 int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入
def int_input(prompt=''): ? ? while True:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#一定大写 ? ? ? ? try: ? ? ? ? ? ? int(input(prompt)) ? ? ? ? ? ? break ? ? ? ? except ValueError:? ? ? ? ? ? ? ? ? ? ? ? ?#数值是不是整型 ? ? ? ? ? ? print("出错啦")
int_input('请输入一个整数:')
2,把文件关闭放在 finally 语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在"My_File.txt"这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
由于finally语句块里试图去关闭一个并没有成功打开的文件,因此会弹出错误内容如下
>>> 出错啦:[Errno 2] No such file or directory: 'My_File.txt' Traceback (most recent call last): ? File "C:\Users\FishC000\Desktop\test.py", line 7, in <module> ? ? f.close() NameError: name 'f' is not defined?
正确如下:
try:
? ? f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
? ? print(f.read())
except OSError as reason:
? ? print('出错啦:' + str(reason))
finally:
? ? if 'f' in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功
? ?? ???f.close()
3,super()函数的理解
super()调用父类的一个方法
class A:
def add(self,x):
y=x+1
print(y)
class B(A):
def add(self,x):
super().add(x)
b=B()
b.add(2)
3?
super 函数超级之处在于你不需要明确给出任何基类的名字,它会自动帮您找出所有基类以及对应的方法。由于你不用给出基类的名字,这就意味着你如果需要改变了类继承关系,你只要改变 class 语句里的父类即可,而不必在大量代码中去修改所有被继承的方法。`6a?
4,类和对象一道题
- 设点 A(X1,Y1)、点 B(X2,Y2),则两点构成的直线长度 |AB| = √((x1-x2)2+(y1-y2)2)
- Python 中计算开根号可使用 math 模块中的 sqrt 函数
- 直线需有两点构成,因此初始化时需有两个点(Point)对象作为参数
import math
#不用分号,用sqrt定义math
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
#x是类变量,self.x是实例变量
#类变量是所有对象共有,其中一个对象将它的值改变其他对象得到的就是他改变后的结果
#实例变量是对象私有,某一个对象将其值改变,不影响其他对象
def getx(self):
return self.x
def gety(self):
return self.y
class Line:
def __init__(self,p1,p2):
self.x=p1.getx()-p2.getx()
self.y=p1.gety()-p2.gety()
self.len=math.sqrt(self.x*self.x+self.y*self.y)
def getlen(self):
return self.len
5,对__new__函数理解
class CapStr(str):
def __new__(cls,string):
string=string.upper()
return str.__new__(cls,string)
- ?新建一个你需要的新new,目前他里面啥也没有
- 插入一条将传入的参数转换为大写的功能,
- 在内建函数new(有功能)中添加这个新功能,
- 把新的new函数(有功能的)返回给新建的还没有功能的new函数
- 总而言之,返回一个老的new,再插入一条变大写的代码
6.魔法方法----构造和析构
- 法方法总是被双下划线包围,例如 __init_
- __new__ 是在一个对象实例化的时候所调用的第一个方法。它跟其他魔法方法不同,它的第一个参数不是 self 而是这个类(cls),而其他的参数会直接传递给 __init__ 方法的?
- 什么时候我们需要在类中明确写出 __init__ 方法?34Z
W}t6<Uk 答:当我们的实例对象需要有明确的初始化步骤的时候,你可以在 __init__ 方法中部署初始化的代码。给出长和宽范围 - 下面存在的问题
class Test: ? ? ? ? def __init__(self, x, y): ? ? ? ? ? ? ? ? return x + y 注:__init__返回的值一定是None,不能是其他_
|