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