python 继承-类的成员-装饰器-反射-异常处理

继承

  1. 继承分为

    1. 单继承
    2. 多继承
  2. 继承的优点

    1. 增加了类的耦合性(耦合性不宜多,宜精)。
    2. 减少了重复代码。
    3. 使得代码更加规范化,合理化。
  3. 调用父类的方法

    1. 父类.func(对象,其他参数)
    2. super().func(参数)
  4. 继承父类的构造函数

    1.  super(Person,self).__init__(name,sex,age)  # 方法一
       super().__init__(name,sex,age)  # 方法二      
      
      
      
  5. 多继承

    1. 一个子类继承多个父类

    2. 多继承的执行顺序

      经典类:沿用深度优先算法。(从左至右,依次查找,每次都选取节点的最左边,一直找到头,如果没有,返回上一个节点在查询其他路线)

      新式类:沿用C3算法。()

      mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
      (其中Child继承自Base1, Base2)
      
  6. super是严格按照对象从属于类的mro顺序执行下一个类

类的成员

  1. 类中属性或方法前加"__"可以生成为私有属性

    • class A:
      
          company_name = '太白'  # 静态变量(静态字段)
          __iphone = '1353333xxxx'  # 私有静态变量(私有静态字段)
      
      
          def __init__(self,name,age): #特殊方法
      
              self.name = name  #对象属性(普通字段)
              self.__age = age  # 私有对象属性(私有普通字段)
      
          def func1(self):  # 普通方法
              pass
      
          def __func(self): #私有方法
              print(666)
      
      • 公有成员,在任何地方都能访问
      • 私有成员,只有在类的内部才能方法
  2. 装饰器

    • 使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
    • 使用装饰器@staticmethod在类中定义函数
    • property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
  3. isinstance(a,b):判断a是否是b类(或者b类的派生类)实例化的对象

  4. issubclass(a,b): 判断a类是否是b类(或者b的派生类)的派生类、

  5. type()中为type的就是元类

反射

  1. python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

  2. 四个可以实现自省的函数:hasattr,getattr,setattr,delattr

    • #检测是否含有某属性
      obj为对象
      print(hasattr(obj,'name'))
      
      #获取属性
      obj为对象
      n=getattr(obj,'name')
      
      #设置属性
      setattr(obj,'sb',True)
      setattr(obj,'show_name',lambda self:self.name+'sb')
      
      # 调用show_name方法
      print(obj.show_name(obj))
      
      #删除属性
      delattr(obj,'age')
      delattr(obj,'show_name')
      
      

异常处理

常用异常:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
  1. 基本语法
try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
    
s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print e
  1. 多分支

一个try对应多个except的情况

  1. 万能异常

    s1 = ‘hello’
    try:
    int(s1)
    except Exception as e:
    print(e)

  2. 多分支+万能异常

    try:
    choice = int(input(‘请输入:’))
    dicchoice

    except ValueError:
    print(‘请输入数字…’)
    except KeyError:
    print(‘您输入的选项超出范围…’)
    except Exception as e:
    print(e)

  3. 与循环中的else比较类似,try代码中,只要出现了异常,则不会执行else语句,如果不出现异常,则执行else语句。

  4. finally

    • 如果出现异常并且成功捕获了,finally会在try中最后执行。
    • 如果出现异常但是没有成功捕获,finally会在异常发生之前执行
    • 关闭文件的链接链接,数据等链接时,需要用到finally。
    • 循环中,finally也会在return之前执行。
  5. raise TypeError(‘类型错误’)

  6. assert 1==2, ‘1 不等于 2’《断言》条件为False报字符传中的错误

猜你喜欢

转载自blog.csdn.net/CSDNzhaojiale/article/details/103515261