目录
1.组合
1.什么是组合:一个对象拥有一个属性,该属性是另一个对象。
2.组合的作用:解决类与类之间的代码冗余问题。与继承起到类似的效果。
3.组合的举例:
# 组合:对象有一个属性,属性是另一个对象
class People():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
class Course():
def __init__(self, name, price, period):
self.name = name
self.price = price
self.period = period
course = Course('python', 20000, '6month') # 对象
class Student(People):
def __init__(self, name, age, gender, course=None):
if course is None:
course = []
self.course = course
super().__init__(name, age, gender)
stu = Student('qql', 20, 'female', course) # 其中一个属性是对象
print(stu.__dict__)
print(stu.course.name)
面向对象的内置函数(魔术方法,__开头的方法)
1.内置函数也称为魔术方法,简称魔法,也就是双下划线__开头的方法。
2.类体中常见的几个内置函数:
__init__ 调用类的时候自动触发
__str__ 输出对象的时候会自动触发(比如打印对象、主动报异常raise Except('')),返回值必须是字符串
__del__ 两个触发场景:第一个是手动调用执行,第二是程序执行完毕后自动触发。两个场景二选一。
__call__ 对象加括号的时候自动触发
3.魔法应用:
class Student():
school = 'SH'
def __init__(self, name, age,gender): # 调用类就会触发
self.name = name
self.age = age
self.gender = gender
# def tell(self):
# print('name: %s, age: %s' % (self.name, self.age))
def __str__(self): # 打印对象会自动触发
return 'name: %s' % self.name
def __del__(self): # 手动调用执行或者程序执行结束后触发
print('del')
del stu.gender
def __call__(self, *args, **kwargs): # 对象加小括号会触发
print(111)
stu = Student('qql', 19, 'female')
print(stu.name) # qql
print(stu.__dict__) # {'name': 'qql', 'age': 19, 'gender': 'female'}
print(stu) # name: qql
# stu.__del__() # 如果手动调用执行了,程序结束后自动触发找不到删除项会报错
print(stu.__dict__) # {'name': 'qql', 'age': 19} 程序结束后
stu() # 对象加括号会触发 __call__ 方法
反射(掌握四个方法)
1.什么是反射:通过字符串的形式操作对象的相关属性。在python中一切都是对象,都可以使用反射。
2.四个反射的方法:
__getattr__ 查找属性或者方法
__setattr__ 给对象修改或者添加属性
__delattr__ 删除属性
__hasattr__ 查看名称空间中是否存在名字,返回布尔值
3.反射应用:
class Student():
school = 'SH'
def __init__(self, name, age,gender): # 调用类就会触发
self.name = name
self.age = age
self.gender = gender
def info(self):
print(111)
stu = Student('qql', 19, 'female') # 实例化对象
print(getattr(stu, 'name', None)) # 用过字符串要到对应属性的属性值
getattr(stu, 'info')() # 通过字符串要到对应方法名加括号调用
# print(getattr(stu, 'name111')) # 如果字符串不存在对应属性名,会报错
setattr(stu, 'course', 'python') # 如果字符串对应的属性名存在就修改属性值,不存在就新增属性
print(stu.__dict__) # 查看对象的名称空间
delattr(stu, 'course') # 如果字符串不存在对应属性名,会报错,如果存在会直接删除对应属性
print(stu.__dict__) # 查看对象的名称空间
print(hasattr(stu, 'name')) # 查看对象名称空间中是否有对应名字,返回布尔值
异常
1.什么是异常:异常就是错误发生的信号,当遇到错误就会抛出异常,如果不处理该错误,就会阻塞后面的代码无法执行。
2.异常的分类:
语法错误:出现应该立刻处理
逻辑错误:出现了应该尽快处理
3.为什么要用异常?
# 异常结构
try:
被监测的代码
except 错误类型2 as e: # e即报错的完整信息
对应处理办法
except 错误类型2 as e:
对应处理办法
except 错误类型3 as e:
对应处理办法
...
else:
以上错误都不出现的时候走这里
finally:
无论有没有出现错误都走这里
4.# 制造异常
class MyException(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
# raise 也是输出的一种,会自动触发__str__
raise MyException('我出现异常了')