Python基础(篇五)
温馨提示:
本文最后更新于 2022年10月27日,已超过 918 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
九. BUG
1. bug的由来和分类
bug的由来:参考百度
bug的分类:语法错误,代码编写错误,程序运行时错误等等
2. 不同异常类型的处理方式
3. 异常处理机制
try...except...else结构:如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块
try: n1=int(input('请输入一个整数:')) n2=int(input(’请输入另一个整数:')) result=n1/n2 except BaseException as e: print('出错了') print(e) else: print('结果为:', result)
try...except...else...finally结构:finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源
try: n1=int(input('请输入一个整数:')) n2=int(input('请输入另一个整数:')) result=n1/n2 except BaseException as e : print('出错了') print(e) else: print('结果为:',result) finally: print(’无论是否产生异常,总会被执行的代码') print(’程序结束')
python的常见异常类型
异常类型 | 描述 |
---|---|
ZeroDivisionError | 除(或取模)零(所有数据类型) |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
NameError | 未声明/初始化对象(没有属性) |
SyntaxError | Python语法错误 |
ValueError | 传入无效的参数 |
4. pycharm的调试模式
- 断点: 程序运行到此处,暂时挂起,停止执行。此时可以详细观察程序的运行情况,方便做出进一步的判断
- 调试视图
- 单击工具栏上的蜘蛛按钮
- 右键单击编辑区:点击: debug'模块名'
- 快捷键:shift+F9
十. 编程思想
1. 两大编程思想
面向对象和面向过程
- 区别:
- 面向过程:事物比较简单,可以用线性的思维去解决
- 面向对象: 事物比较复杂,使用简单的线性思维无法解决
- 共同点:
- 面向过程和面向对象都是解决实际问题的一种思维方式
- 总结:
- 二者相辅相成,并不是对立的
- 解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系、方便我们分析整个系统;具体到微观操作,仍然使用面向过程方式来处理
2. 类和对象的创建
类的创建
语法
class Student: native_place='吉林’.#类属性 def __init__(self, name,age) : #name, age为实例属性 self.name=name self.age=age #实例方法 def info(self): print(’我的名字叫:', self.name,’年龄是:',self.age) #类方法 classmethoddef cm(cls) : print('类方法')#静态方法 staticmethoddef sm() : print('静态方法’)
类的组成:类属性 实例方法 静态方法 类方法
对象的创建
语法
#创建Student类的实例对象 stu=Student('Jack', 20) print(stu. name) #实例属性 print(stu.age)#实例属性 stu.info()#实例方法
和java一样,先创建类再根据类创建对象
3. 类对象和类属性
4. 类方法和静态方法
- 类属性:类中方法外的变量称为类属性,被该类的所有对象所共享
- 类方法: 使用@classmethod修饰的方法,使用类名直接访问的方法
- 静态方法: 使用@staticmethod修饰的主法,使用类名直接访问的方法
5. 封装继承多态
不希望外部访问属性和方法时,在属性和方法前加__
class User:
def __init__(self,name,age):
self.name = name
self.__age = age #在类的属性和方法前加两个__ 在方法外部则不可以调用该属性和方法
def getAge(self):
return self.__age
user1 = User("张三",18)
print(user1.getAge())
print(user1._User__age) #可以通过这种方式获取私有化的属性和方法,不推荐
print(dir(User)) #获取对象有哪些属性和方法
继承
语法格式
class 子类类目(父类1,父类2..): pass
如果一个类没有继承任何类,则默认继承object
python支持多继承
定义子类时,必须在其构造函数中调用父类的构造函数
继承其他类时,需要重写其他类的init方法
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def userInfo(self):
print("这个人的信息",self.name,self.age)
class Student(Person):
def __init__(self,name,age,num):
super().__init__(name,age)
self.num = num
class Teacher(Person):
def __init__(self,name,age,type):
super().__init__(name,age)
self.type = type
def userInfo(self):
print(self.name,self.age,self.type)
stu = Student("张三",20,9527)
teacher = Teacher("李四",45,12)
stu.userInfo()
teacher.userInfo()
tips: dir(object) #返回对象的所有属性值
6. 特殊属性和方法
名称 | 描述 | |
---|---|---|
特殊属性 | __dict__ | 获得类对象或实例对象所绑定的所有属性和方法的字典 |
特殊方法 | __len__() | 通过重写__len__()方法,让内置函数len()的参数可以是自定义类型 |
特殊方法 | __add__() | 通过重写__add__()方法,可使用自定义对象具有“+”功能 |
特殊方法 | __new__() | 用于创建对象 |
特殊方法 | __init__() | 对创建的对象进行初始化 |
class User:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self) -> str:
return "这是{0},年龄是{1}".format(self.name,self.age)
def __add__(self, *args):
result = 0
for i in args:
result += i
return result
def __len__(self):
return len(self.name)
u = User("张三1998",20)
print(u)
print(dir(u))
print(u.__add__(10,20,30,40))
print(u.__len__())
7. 浅拷贝和深拷贝
- 变量的赋值操作: 只是形成两个变量,实际上还是指向同一个对象
- 浅拷贝: Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
- 深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
浅拷贝
浅拷贝不会拷贝子对象,拷贝对象会引用源对象的子对象
class Head:
pass
class Body:
pass
class User:
def __init__(self,head,body):
self.head=head
self.body = body
h1 = Head()
b1 = Body()
u1 = User(h1,b1)
import copy
u2 = copy.copy(u1)
print("用户1信息",id(u1),u1)
print("用户1子信息",id(u1.head),u1.head,id(u1.body),u1.body)
print("用户2信息",id(u2),u2)
print("用户2子信息",id(u2.head),u2.head,id(u2.body),u2.body)
深拷贝,子对象也会重新拷贝一份
u2 = copy.deepcopy(u1)
正文到此结束
- 本文标签: python
- 本文链接: https://www.tianyajuanke.top/article/46
- 版权声明: 本文由吴沛芙原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权