实例方法、类方法、静态方法

  1. class CObj(object):
  2. # 一个类属性
  3. class_number = 10
  4. # 实例方法必须使用实例调用,第一个参数是一个
  5. # 指向当前对象的"指针",名字通常是 self,参数
  6. # 可以自己添加内容
  7. def function1(self):
  8. print("这是一个实例方法: ", CObj.class_number)
  9. # 使用 @classmethod 修饰的方法就是类方法,类方
  10. # 法的第一个参数就是类本身,通常叫做 cls,可以
  11. # 使用 cls 访问到当前类的类属性
  12. @classmethod
  13. def function2(cls):
  14. print("这是一个类方法: ", cls.class_number)
  15. # 在使用时和类方法没有太大区别,对
  16. # 参数没有要求,如果想要访问类属性
  17. # 可以直接通过类名
  18. @staticmethod
  19. def function3():
  20. print("这是一个静态方法: ", CObj.class_number)
  21. obj = CObj()
  22. obj.function1()
  23. obj.function2()
  24. obj.function3()

类的私有属性

  1. # 类的"私有"属性,所有只以双下划线开头的属性会被认为
  2. # 是私有的,不能[直接]被外界访问到
  3. class CObj1():
  4. __number = 1515
  5. # 实际上的私有只是解释器给属性进行了更名,_类名+属性名
  6. # 可以但是不推荐使用这种方式进行访问,所有以单下划线开
  7. # 头的命名,约定俗成都是不可访问的
  8. print(CObj1.__dict__)
  9. print(CObj1._CObj1__number)

image.png

继承

1.查看所有的基类

  1. class Obj(object):
  2. def __init__(self):
  3. pass
  4. # 所有的基类组成的一个元组
  5. print(Obj.__bases__)
  6. # 并不是所有的属性都能够被遍历到
  7. ttt=Obj()

image.png
2.继承的形式, class 类名(父类名, …)
通过类名访问父类属性或方法

  1. class CBase1(object):
  2. def __init__(self):
  3. print("CBase1")
  4. class CBase2(object):
  5. def __init__(self):
  6. print("CBase2")
  7. class CObj(CBase1, CBase2):
  8. def __init__(self):
  9. print("CObj")
  10. # 可以使用父类的类名直接访问父类的属性(方法)
  11. CBase1.__init__(self)
  12. CBase2.__init__(self)
  13. obj = CObj()

image.png
通过super找到父类并访问属性

  1. class CBase1(object):
  2. def __init__(self):
  3. print("CBase1")
  4. class CBase2(object):
  5. def __init__(self):
  6. print("CBase2")
  7. class CObj(CBase1, CBase2):
  8. def __init__(self):
  9. print("CObj")
  10. # 默认调用的是原型链中当前类的下一个
  11. super().__init__()
  12. # super 实际找到的类就是第一个参数在原型链中的下一个
  13. super(CBase1, self).__init__()
  14. obj = CObj()

image.png
3.类的相关操作
断一个类是不是另一个类的子类

  1. class CBase1(object):
  2. def __init__(self):
  3. print("CBase1")
  4. class CBase2(object):
  5. def __init__(self):
  6. print("CBase2")
  7. # 继承的形式, class 类名(父类名, ...)
  8. class CObj(CBase1, CBase2):
  9. def __init__(self):
  10. print("CObj")
  11. # 可以使用父类的类名直接访问父类的属性(方法)
  12. CBase1.__init__(self)
  13. # 默认调用的是原型链中当前类的下一个
  14. super().__init__()
  15. # super 实际找到的类就是第一个参数在原型链中的下一个
  16. super(CBase1, self).__init__()
  17. # 判断一个类是不是另一个类的子类
  18. print(issubclass(CObj, object))

image.png
输出当前的所有父类组成的元组

  1. class CBase1(object):
  2. def __init__(self):
  3. print("CBase1")
  4. class CBase2(object):
  5. def __init__(self):
  6. print("CBase2")
  7. # 继承的形式, class 类名(父类名, ...)
  8. class CObj(CBase1, CBase2):
  9. def __init__(self):
  10. print("CObj")
  11. # 可以使用父类的类名直接访问父类的属性(方法)
  12. CBase1.__init__(self)
  13. # 默认调用的是原型链中当前类的下一个
  14. super().__init__()
  15. # super 实际找到的类就是第一个参数在原型链中的下一个
  16. super(CBase1, self).__init__()
  17. print(CObj.__bases__)

image.png
显示当前类的继承原型链

  1. class CBase1(object):
  2. def __init__(self):
  3. print("CBase1")
  4. class CBase2(object):
  5. def __init__(self):
  6. print("CBase2")
  7. # 继承的形式, class 类名(父类名, ...)
  8. class CObj(CBase1, CBase2):
  9. def __init__(self):
  10. print("CObj")
  11. # 可以使用父类的类名直接访问父类的属性(方法)
  12. CBase1.__init__(self)
  13. # 默认调用的是原型链中当前类的下一个
  14. super().__init__()
  15. # super 实际找到的类就是第一个参数在原型链中的下一个
  16. super(CBase1, self).__init__()
  17. print(CObj.mro())

image.png
5.Python 存在继承关系时,不会出现二义性问题,
当访问一个属性的时候,解释器会遍历原型链,首先找到谁就用谁

异常

1.判断抛出什么类型的异常,再写抛出异常
产生异常的时候,异常的类型可以在输出窗口看到,不需要记忆

image.png
image.png
2.try finally 无论是否产生异常,都保证执行代码

  1. try:
  2. print("没有异常")
  3. finally:
  4. print("永远会执行")

3.通用的异常处理写法

  1. try:
  2. print(a)
  3. # 接受任意一个异常对象并且取名字
  4. except Exception as e:
  5. print(e)

4.主动的抛出异常

  1. name = input('please input name:')
  2. if name == 'hello':
  3. raise NameError('input name error !')