内容概要
组合
组合:就是一个对象拥有一个属性,该属性的值事另一个对象
解决类和类之间代码冗余问题
1.继承:满足什么是什么的关系,is-a的关系
2.组合:在对象中定义一个属性,属性的值是另一个对象
继承是一把双刃剑,并不是继承的越多就越好
class People():
school = 'SH'
def __init__(self, name, age, gender, ):
self.name = name
self.age = age
self.gender = gender
class Admin(People):
pass
class Course():
def __init__(self, name, period, price, ):
self.name = name
self.period = period
self.price = price
python = Course('python', '6mon', 10000)
linux = Course('linux', '5mon', 20000)
class Student(People, Course):
def __init__(self, name, age, gender, course=None):
if course is None:
course = []
self.courses = course
super().__init__(name, age, gender, )
def choose_course(self, stu_obj, course):
stu_obj.courses.append(course)
面向对象的内置函数
1. __init__()
2. __str__()
3. __del__()
4. __enter__()
5. __exit__()
6. __call__()
class Student():
school = 'SH'
# 调用类的时候触发
def __init__(self, name, age):
self.name = name
self.age = age
def tell(self):
print('name: %s, age: %s' % (self.name, self.age))
# 打印对象的时候,自动触发的函数
# 返回值只能是字符串
def __str__(self):
return 'name:%s' % self.name
# return 123
# 1. 手动执行del
# 2. 程序执行完毕触发
def __del__(self):
print('__del__')
self.f.close()
# 对象加括号自动触发
def __call__(self, *args, **kwargs):
print('__call__')
stu = Student('aaa', 18)
反射
# 对象通过字符串来操作属性
1. getattr
print(getattr(stu, 'name1', None)) # stu.name
stu.func()
print(getattr(stu, 'func'))
getattr(stu, 'func')() # 必须掌握
2. setattr
setattr(stu, 'x', 123)
print(stu.__dict__)
3. hasattr
print(hasattr(stu, 'name'))
4. delattr
delattr(stu, 'name')
print(stu.__dict__)
异常
什么是异常:异常就是错误发生的信号,如果不对该信号做处理,异常之后的代码不会执行
异常的种类:
1. 语法错误
2. 逻辑错误
2. 为什么要用异常
增强代码的健壮性
3. 怎么用异常?
try:
被监测代码
except 异常的类型:
pass
except 异常的类型:
pass
except 异常的类型:
pass
except Exception as e:
pass
else:
# 当被监测代码没有发生异常的时候,触发的
pass
finally:
不管被监测的代码有没有出错,都执行
1、尽量只在有可能出错的代码段才使用
2、异常处理中的代码越少越好
3、异常处理的频率越低越好
![image]()