Python学习笔记【异常处理+类和对象+魔法方法】

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)

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,不能是其他_

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值