实例方法、类方法、静态方法
class CObj(object):# 一个类属性class_number = 10# 实例方法必须使用实例调用,第一个参数是一个# 指向当前对象的"指针",名字通常是 self,参数# 可以自己添加内容def function1(self):print("这是一个实例方法: ", CObj.class_number)# 使用 @classmethod 修饰的方法就是类方法,类方# 法的第一个参数就是类本身,通常叫做 cls,可以# 使用 cls 访问到当前类的类属性@classmethoddef function2(cls):print("这是一个类方法: ", cls.class_number)# 在使用时和类方法没有太大区别,对# 参数没有要求,如果想要访问类属性# 可以直接通过类名@staticmethoddef function3():print("这是一个静态方法: ", CObj.class_number)obj = CObj()obj.function1()obj.function2()obj.function3()
类的私有属性
# 类的"私有"属性,所有只以双下划线开头的属性会被认为# 是私有的,不能[直接]被外界访问到class CObj1():__number = 1515# 实际上的私有只是解释器给属性进行了更名,_类名+属性名# 可以但是不推荐使用这种方式进行访问,所有以单下划线开# 头的命名,约定俗成都是不可访问的print(CObj1.__dict__)print(CObj1._CObj1__number)
继承
1.查看所有的基类
class Obj(object):def __init__(self):pass# 所有的基类组成的一个元组print(Obj.__bases__)# 并不是所有的属性都能够被遍历到ttt=Obj()

2.继承的形式, class 类名(父类名, …)
通过类名访问父类属性或方法
class CBase1(object):def __init__(self):print("CBase1")class CBase2(object):def __init__(self):print("CBase2")class CObj(CBase1, CBase2):def __init__(self):print("CObj")# 可以使用父类的类名直接访问父类的属性(方法)CBase1.__init__(self)CBase2.__init__(self)obj = CObj()

通过super找到父类并访问属性
class CBase1(object):def __init__(self):print("CBase1")class CBase2(object):def __init__(self):print("CBase2")class CObj(CBase1, CBase2):def __init__(self):print("CObj")# 默认调用的是原型链中当前类的下一个super().__init__()# super 实际找到的类就是第一个参数在原型链中的下一个super(CBase1, self).__init__()obj = CObj()

3.类的相关操作
断一个类是不是另一个类的子类
class CBase1(object):def __init__(self):print("CBase1")class CBase2(object):def __init__(self):print("CBase2")# 继承的形式, class 类名(父类名, ...)class CObj(CBase1, CBase2):def __init__(self):print("CObj")# 可以使用父类的类名直接访问父类的属性(方法)CBase1.__init__(self)# 默认调用的是原型链中当前类的下一个super().__init__()# super 实际找到的类就是第一个参数在原型链中的下一个super(CBase1, self).__init__()# 判断一个类是不是另一个类的子类print(issubclass(CObj, object))

输出当前的所有父类组成的元组
class CBase1(object):def __init__(self):print("CBase1")class CBase2(object):def __init__(self):print("CBase2")# 继承的形式, class 类名(父类名, ...)class CObj(CBase1, CBase2):def __init__(self):print("CObj")# 可以使用父类的类名直接访问父类的属性(方法)CBase1.__init__(self)# 默认调用的是原型链中当前类的下一个super().__init__()# super 实际找到的类就是第一个参数在原型链中的下一个super(CBase1, self).__init__()print(CObj.__bases__)

显示当前类的继承原型链
class CBase1(object):def __init__(self):print("CBase1")class CBase2(object):def __init__(self):print("CBase2")# 继承的形式, class 类名(父类名, ...)class CObj(CBase1, CBase2):def __init__(self):print("CObj")# 可以使用父类的类名直接访问父类的属性(方法)CBase1.__init__(self)# 默认调用的是原型链中当前类的下一个super().__init__()# super 实际找到的类就是第一个参数在原型链中的下一个super(CBase1, self).__init__()print(CObj.mro())

5.Python 存在继承关系时,不会出现二义性问题,
当访问一个属性的时候,解释器会遍历原型链,首先找到谁就用谁
异常
1.判断抛出什么类型的异常,再写抛出异常
产生异常的时候,异常的类型可以在输出窗口看到,不需要记忆


2.try finally 无论是否产生异常,都保证执行代码
try:print("没有异常")finally:print("永远会执行")
3.通用的异常处理写法
try:print(a)# 接受任意一个异常对象并且取名字except Exception as e:print(e)
4.主动的抛出异常
name = input('please input name:')if name == 'hello':raise NameError('input name error !')
