zoukankan      html  css  js  c++  java
  • 面向对象:组合、抽象类

    组合:适用于“什么有什么”;组合方法: 类1对象.变量 = 类2对象

    选课例题:

    class LuffyPeople:
        school = "luffycity"
    
        def __init__(self,name,gender,age):
            self.name = name
            self.gender = gender
            self.age = age
    
    
    class Teacher(LuffyPeople):
    
        def __init__(self,name,gender,age,level,salary):
            super().__init__(name,gender,age)
    
            self.level = level
            self.salary = salary
    
        def teach(self):
            print("%s is teaching" %self.name)
    
    class Student(LuffyPeople):
    
        def __init__(self,name,gender,age,class_time):
            super().__init__(name,gender,age)
    
            self.class_time = class_time
    
        def learn(self):
            print("%s is learning" %self.name)
    
    class Course:
    
        def __init__(self,course_name,course_price,course_period):
            self.course_name = course_name
            self.course_price = course_price
            self.course_period = course_period
    
    """生成两个teacher对象"""
    teacher1 = Teacher("alex","male",22,10,3000)
    teacher2 = Teacher("egon","male",28,20,5000)
    
    """生成一个课程对象"""
    python = Course("Python",6000,"3mons")
    
    """
    老师对象和课程对象之间: 不是“什么是什么”的关系,所以不能用类的继承;
    而是 老师“有”课程 的关系, 所以应该是给老师这个对象添加一个课程的属性
    """
    teacher1.course = python   # teacher1.course是一个课程对象
    teacher2.course = python   # 通过 .course(变量) 把 teacher1 和 python 这两个变量整合在了一起
    
    print(python)
    print(teacher1.course)
    print(teacher2.course)
    # 打印结果:

      # <__main__.Course object at 0x0000000D52A86B70>
      # <__main__.Course object at 0x0000000D52A86B70>
      # <__main__.Course object at 0x0000000D52A86B70>

    """查看teacher教的课程名"""
    print(teacher1.course.course_name)   # teacher1.course.course_name 就相当于 python.course_name  #  给老师这个对象定制了一个课程的属性
    
    # 打印结果:
    # Python
    
    """生成一个学生对象"""
    stu1 = Student("neo","male",22,"08:30:00")

    为了方便查询课程信息,可以在Course这个类中专门添加一个查询课程信息的功能(函数),如下所示:

    class Course:
    
        def __init__(self,course_name,course_price,course_period):
            self.course_name = course_name
            self.course_price = course_price
            self.course_period = course_period
    
        """为了方便查询课程信息,可以定义一个课程查询的函数"""
        def tell_info(self):
            print("课程名<%s>  课程价格<%s>  课程周期<%s>" %(self.course_name,self.course_price,self.course_period))
    
    """查询teacher1的课程信息"""
    teacher1.course.tell_info()
    
    # 运行结果:
    # 课程名<Python>  课程价格<6000>  课程周期<3mons>

    给老师teacher1这个对象定制了一个课程的属性(变量course),然后让这个课程属性(变量course) 指向了另外一个课程对象python,通过这种方式让teacher1 “有了” python;这种“什么有什么”的方式就是“组合”, 把Course类和Teacher类“组合”在了一起。 通过“组合”,能够让好多类组合在一起

    如:

    """生成两个课程对象"""
    python = Course("Python",6000,"3mons")
    linux = Course("Linux",4000,"5mons")
    
    """生成一个学生对象"""
    stu1 = Student("neo","male",22,"08:30:00")
    
    """给stu1添加python和linux两门课程"""
    stu1.course1 = python
    stu1.course2 = linux
    
    stu1.course1.tell_info()
    stu1.course2.tell_info()
    
    # 运行结果:
    # 课程名<Python>  课程价格<6000>  课程周期<3mons>
    # 课程名<Linux>  课程价格<4000>  课程周期<5mons>

    # 也可以用列表的形式添加课程对象
    stu1.course = []
    stu1.course.append(python)
    stu1.course.append(linux)

    print(stu1.course)

    # 运行结果:
    # [<__main__.Course object at 0x0000002E85B36C88>, <__main__.Course object at 0x0000002E85B36CC0>]
     

    抽象类:

    示例代码如下:

    import abc  # 导入 abc 模块
    
    """抽象类的定义方法"""
    class Animal(metaclass=abc.ABCMeta):   #  抽象类的括号里面要传入 metaclass=abc.ABCMeta
        all_type = "animal"  # 抽象类也是类的一种,其内部的功能属性也能够被其子类调用
    
        @abc.abstractmethod
        def run(self):
            pass
    
        @abc.abstractmethod
        def eat(self):
            pass
        """
        装饰器:@abc.abstractmethod
        定义函数
        pass (即 不写具体的执行代码)
        """
        """
        这种功能名(函数)在Animal的子类中一定要有,否则子类不能被实例化
        所以通过抽象类的方式,能够统一功能名
        """
    
    class People(Animal):
    
        def run(self):
            print("people is running")
    
        def eat(self):
            pass
    
    people = People()  # 因为People这个类中有run和eat这两个功能,所以能够实例化
    print(people.all_type)
    
    # 运行结果:
    # animal
    
    """另外,抽象类只能被继承,不能被实例化"""
  • 相关阅读:
    千氪公开课第一期|如何实现写作收益的最大化?-千氪
    2018年十大区块链投资机构盘点-千氪
    vscode 问题
    jquery点击输入框提示文字消失输入文字变色
    IE8兼容css3
    点击特定按钮,文本框实现输入状态变化
    h5页面在iOS上的问题解决
    纯css三角提示框,兼容IE8
    适配问题
    webstorm配置编译sass
  • 原文地址:https://www.cnblogs.com/neozheng/p/8489452.html
Copyright © 2011-2022 走看看