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+=1 a=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**2 obj =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.bbb f1.bbb='aaa' del f1.bbb
4.isinstance、issubclass
对象与类之间的关系: class A: pass class B(A): pass print(isinstance(obj,N)) => 判断obj对象是否是由N类(N类的派生类)实例化的对象,返回True 类与类之间的关系: class A: pass class B(A): pass class C(B): pass print(issubclass(C,B)) print(issubclass(C,A)) print(issubclass(M,N)) => 判断M是否是N(N的派生类)的子类
5.异常处理
异常:程序出现中断,飘红,致使整个项目中断了 错误类型:语法错误、逻辑错误 异常常见种类: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 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 = msg raise Connection('U R 蔡徐坤') # 异常处理不能经常使用:耗费性能,代码的可读性变差
来源:https://www.cnblogs.com/wxl1025/p/11172642.html