1.类的私有成员
类中的私有成员: 私有类的静态属性, 私有对象属性,私有方法=>类外部、派生类不可访问,内部可以访问以私有属性为例:class B: school_name = '老男孩教育' __consc_edu = '良心教育'class A(B): class_name = 'python23' __girlnum = '1个' def func(self): print(self.__girlnum) def func1(self): print(self.__consc_edu)obj = A()print(obj.__girlnum) #类外部不可访问print(A.__girlnum) #类外部不可访问obj.func1() #派生类不可访问obj.func() #内部可以访问拓展:class A: __girlnum = '1个' print(A.__dict__)python中所有的私有成员: 就是在私有成员前面加上 _类名而已print(A._A__girlnum) #千万不要这么去访问!
2.类方法与静态方法
class A: def func(self): print('实例方法') @classmethod # 类方法: 由类名直接调用的方法,会自动的将类名传给cls def a_func(cls): print('这是类方法')A.a_func()obj=A()obj.a_func() # 对象也可以调用类方法,但是会自动将其从属于的类名传给cls# 定义一个Student类,统计学生的个数class Student: n=0 def __init__(self,name): self.name=name Student.count() @classmethod def count(cls): cls.n+=1a=Student('蔡徐坤')b=Student('ikun')print(Student.n)# 静态方法: 不依赖于类,也不依赖于对象,就是一个普通的函数放置于类中是结构更加清晰与合理class A: def __init__(self,name): self.name=name @staticmethod def static_func(): print('静态方法')obj = A('蔡徐坤')obj.static_func()
3.属性
class BMI: def __init__(self, name, weight, height): self.name = name self.weight = weight self.height = height def BMI(self): return self.weight / self.height**2obj =BMI('蔡徐坤',65, 1.77)print(obj.BMI())=> 要让bmi方法伪装成属性,虽然在代码级别没有提升,但是看起来更合理class BMI: def __init__(self, name, weight, height): self.name = name self.weight = weight self.height = height @property def bmi(self): return self.weight / self.height**2 @bmi.setter def bmi(self,a): # 注意要传参数 print('修改时运行') @bmi.deleter def bmi(self): print('删除时运行')obj =BMI('蔡徐坤',65, 1.77)print(obj.bmi)obj.bmi='唱跳rap'del obj.bmi# 设置属性的另外一种写法:class Foo: def get_AAA(self): print('get的时候运行我啊') def set_AAA(self,value): print('set的时候运行我啊') def delete_AAA(self): print('delete的时候运行我啊') bbb = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应f1=Foo()f1.bbbf1.bbb='aaa'del f1.bbb
4.isinstance、issubclass
对象与类之间的关系:class A: passclass B(A): passprint(isinstance(obj,N)) => 判断obj对象是否是由N类(N类的派生类)实例化的对象,返回True类与类之间的关系:class A: passclass B(A): passclass C(B): passprint(issubclass(C,B))print(issubclass(C,A))print(issubclass(M,N)) => 判断M是否是N(N的派生类)的子类
5.异常处理
异常:程序出现中断,飘红,致使整个项目中断了错误类型:语法错误、逻辑错误异常常见种类:AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常;基本上是无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误(的子类) ;代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 使用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不期望的值,即使值的类型是正确的异常形式:单分支:try: l1 = [1,2,3] print(l1[100])except IndexError as e: print(e) print('索引错误')多分支:dic = {1: 111,2: 222,3: 333,}while 1: try: num = input('请输入序号') int(num) print(dic[int(num)]) except KeyError as e: print('选项超出范围,请重新输入') except ValueError as e: print('请输入数字')# 及时解决异常,程序的分流万能异常:try: l1 = [1,2,3] print(l1[100])except Exception as e: print(e)什么时候用万能异常,什么时候用多分支?只是想把这个异常处理掉,让程序继续运行 => 万能异常根据不同的异常执行不用的逻辑流程 => 多分支万能异常+多分支:dic = {1: 111,2: 222,3: 333,}while 1: try: num = input('请输入序号') int(num) print(dic[int(num)]) except KeyError as e: print('选项超出范围,请重新输入') except Exception: pass # 万能异常要写在最后异常处理其他成员:dic = {1: 111,2: 222,3: 333,}while 1: try: num = input('请输入序号') int(num) print(dic[int(num)]) except KeyError as e: print('选项超出范围,请重新输入') except Exception: pass else: print(666)# 如果上面无异常执行else语句,否则不执行else语句finally:在整个程序终止之前,执行finally,通常用在文件操作、数据库、函数,以文件操作为例:try: f = open('register', mode='w') f.write('abc') f.write('abc') f.write('abc') l1 = [1, 2, 3] print(l1[1000]) f.write('abc')finally: f.close()主动抛出异常:raise Exception('U R 蔡徐坤')断言:assert 条件 => 条件成立,执行下面代码;条件不成立,终止程序自定义异常:class Connection(BaseException): def __init__(self,msg): self.msg = msgraise Connection('U R 蔡徐坤')# 异常处理不能经常使用:耗费性能,代码的可读性变差