python 面向对象之组合、魔法、反射

目录

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)

python 面向对象之组合、魔法、反射

面向对象的内置函数(魔术方法,__开头的方法)

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__ 方法

python 面向对象之组合、魔法、反射

反射(掌握四个方法)

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'))  # 查看对象名称空间中是否有对应名字,返回布尔值

python 面向对象之组合、魔法、反射

异常

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('我出现异常了')

python 面向对象之组合、魔法、反射

python 面向对象之组合、魔法、反射

上一篇:对于指针地址指向及return 的小理解


下一篇:SQL的查找操作