Python 对象的组合、内置函数、反射、异常
对象的组合:
把一个对象作为另一个对象的属性值。
继承:子类会继承父类的所有属性和方法,
为什么要用组合,而不用继承呢?
例:
class People():
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
class Student(People):
def __init__(self,course=None):
if course == None:
self.course = []
self.course = course
stu = Student('ly',18,'male',['python'])
这样产生的对象stu就继承了People的所有属性和方法
但是如果course的属性有好多个呢?这样就不方便了
这时不防再另外写个course的类:
class Course():
def __init__(self,name,price):
self.name = name
self.price = price
python = Course('python',12000)
这样就产生了python这个课程对象
可以把这个对象,赋值给stu,这样stu不就有课程了吗?
stu.course = python
要查看stu的课程属性:
stu.course.name
stu.course.price
内置函数(魔法方法):
类的内置函数,是在调用类时自动触发的方法,也称为魔法方法。
主要的内置函数有:
1、__init__() 实例化对象的时候自动触发
2、__str__() 打印的时候自动触发,返回值只能是 字符串
3、__del__() 删除方法或发生时触发,程序执行结束时也会触发
4、__enter__() __exit__() with 的上下文管理器
5、__call__() 对象加()时自动触发
def __str__(self):
return 'name:%s' % self.name
# return 123 报错 返回值只能是字符串
stu = Student('ly', 20)
print(stu) # name:ly 就相当于打印 print(stu.__str__())
反射:
对象通过字符串来操作属性
主要的反射方法有:
__getattr__()
__delattr__()
__hasattr__()
__setattr__()
stu = Student('ly',18,'male')
# 1. getattr
print(getattr(stu, 'name1', None)) # None 相当于 stu.name 第一个参数传对象 第二个传属性 第三个传找不到的返回结果
stu.func() # from func 直接调用
print(getattr(stu, 'func')) # 通过字符串调用 <bound method Student.func of <__main__.Student object at 0x0000020BB6FBBD30>>
getattr(stu, 'func')() # from func 必须掌握
# 2. setattr
setattr(stu, 'x', 123) # 第一个传对象 第二个传属性名 第三个传属性值
print(stu.__dict__) # {'name': 'ly', 'age': 18, 'x': 123}
# 3. hasattr
print(hasattr(stu, 'name')) # True 确认对象中是否有属性 第一个传对象 第二个传属性
print(hasattr(stu, 'name1')) # False
# 4. delattr
delattr(stu, 'name') # 删除 第一个传对象 第二个传属性
print(stu.__dict__) # {'age': 18}
# 类也可以使用
print(getattr(Student, 'school'))
异常:
程序运行中出现的错误情况
异常的种类:
1、语法错误
2、逻辑错误
异常的捕获:
try:
pass
except 异常类型:
pass
except 异常类型:
pass
except Exception as e: # 万能异常 不管什么类型错误 都可以接收
pass
else:
pass # 异常不出现时执行
finally:
pass #有没有异常都要执行
自定义异常捕获:
class Myerror(BaseException):
pass
自定义异常类,都要继承BaseException类
浙公网安备 33010602011771号