原创

Python基础(篇五)

温馨提示:
本文最后更新于 2022年10月27日,已超过 918 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

九. BUG

1. bug的由来和分类

​ bug的由来:参考百度

​ bug的分类:语法错误,代码编写错误,程序运行时错误等等

2. 不同异常类型的处理方式

3. 异常处理机制

  1. 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)
    
  1. 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. 两大编程思想

面向对象和面向过程

  1. 区别:
    • 面向过程:事物比较简单,可以用线性的思维去解决
    • 面向对象: 事物比较复杂,使用简单的线性思维无法解决
  2. 共同点:
    • 面向过程和面向对象都是解决实际问题的一种思维方式
  3. 总结:
    • 二者相辅相成,并不是对立的
    • 解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间复杂的关系、方便我们分析整个系统;具体到微观操作,仍然使用面向过程方式来处理

2. 类和对象的创建

  1. 类的创建

    • 语法

      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)
正文到此结束