组合 反射 抛出异常

发布时间 2023-10-10 22:17:36作者: Lubomierz
1. 组合
组合:把另外一个类的对象属性赋值给当前对象的属性

首先要明白 什么是什么的区别 为什么要继承父类
比如三个类  老师类  学生类 课程类;   虽然老师和学生有课程  但是老师和学生是课程吗? 还是老师和同学是课程
"""
    is a 的关系 代表的是 继承的关系
    和什么有什么的关系 就是组合
"""
所以不想继承 又想用到其他类中的属性 就需要 创建超级对象 来 获取其他类中的属性和方法 
class Student:
    pass

class Teacher:
    pass

class cuosce:
    pass


案例如下:
"""
1. 老师类 : 初始化属性有  name,gender,age ,evol.salary
2. 学生类 : 初始化属性有  name , gender age uid class_name
3. 课程类: name gender age course price day 
4. 把类中冗余的代码写一个类 来继承
"""
class Tar_Stu:
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

class Teacher(Tar_Stu):

    def __init__(self,name,age,gender,evol,salary,course):
        super().__init__(name,age,gender)
        self.evol = evol
        self.salary = salary
        self.course = course

    def ter_course(self):
        print('%s 老师有 %s 课 ' % (self.name,self.course))

class Student(Tar_Stu):

    def __init__(self, name, age, gender,uid,class_name,course):
        super().__init__(name, age, gender)
        self.uid = uid
        self.class_name = class_name
        self.course = course

    def stu_course(self):
        print('%s 同学有 %s 课 ' % (self.name,self.course))

class Course:
    def __init__(self,course,price,day):
        self.course = course
        self.price = price
        self.day = day

    def course_time(self):
        print('%s 课程 %s 钱 %s 天' % (self.course,self.price,self.day))


terchar = Teacher('huang',28,'male','10级',15000,'python')  # 老师对象
stu = Student('lu',88,'male',88,'九五班','python')         # 学生对象

python = Course('python',22000,'180')                  # 课程对象
linux = Course('linux',25000,200)                       # 课程对象

terchar.tar_course = python             # python 对象会赋值给 tar_course
terchar.tar_course.course_time()        # 调用的时候 调用的对象.被赋值的名字.方法即可 完成了不用继承也可以用其他类

stu.stu_course = linux
stu.stu_course.course_time()

stu.stu_course = [python,linux]     # 可以用列表来装多个 赋值对象

for i in stu.stu_course:            # 调用的时候 for 循环即可
    i.course_time()

2. 反射

"""反射:就是通过字符串的形式来操作对象的属性"""

四个内置函数:
    getattr: 获取属性 ##### 用的最多
    setattr:设置属性
    hasattr:判断是否有某个属性
    delattr:删除

class Student():
    school = 'SH'

    def __init__(self,name, age):
        self.name=name
        self.age = age

    def func(self):
        print('from func')

    def index(self):
        print('from index')
stu = Student('kevin', 20)

# 1. 获取属性
"""当你查询的属性不存在的时候,如果给了第三个参数,就返回第三个参数"""
"""如果你给了第三个参数,查询的属性也存在,那就直接返回属性对应的值,默认值就没用了"""
# res=getattr(stu, 'school1', 666) # SH 666

res=getattr(stu, 'func1', stu.index) # 获取类中的方法 第一个参数是 对象 第二的参数是 类中的方法 没有找到的情况下 就返回第三个默认值
print(res())

## 设置
setattr(stu, 'x', 666) # 类中有这个属性就修改 没有就增加
print(stu.__dict__)

### hasattr 判断有没有这个属性 返回布尔值
print(hasattr(stu, 'func'))
if hasattr(stu, 'func'):
    getattr(stu, 'func')()
else:
    ...

## delattr 删除属性 没有就报错 有就删除
delattr(stu, 'name1')
del stu.name
print(stu.__dict__)