美文网首页
面向对象 三

面向对象 三

作者: 吃可爱长大鸭 | 来源:发表于2021-03-01 15:21 被阅读0次

目录

1.组合
2.封装

小结

1.组合
    一个对象将另一个(或多个)对象作为属性
    组合的目的 降低冗余,降低耦合度

2.封装
    封装指的是,隐藏内部的实现细节,对外提供访问的接口
    封装是隐藏,但是不是单纯的隐藏
    能封装的内容:属性和方法
    如何封装:名字前加__双下滑线

1.组合

"""
    组合
    什么叫组合 多个对象放在一起叫组合
    组合 也可以降低代码的冗余
    在对象中,可以放入其它对象
    python中一切皆对象(向对象中放的字符串,数字,字典)

    组合:对象内,包含其他对象
        -对象.对象.对象.对象的属性和方法
        -只需要拿到一个对象,就相当于拿到了一个百宝箱
        -对象.属性=对象
        -对象.方法(对象)
"""
class Person(object):  # 基类
    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex


class Student(Person):
    def __init__(self, name, sex, age):
        super().__init__(name, sex, age)  # 等同于下面三句话
        # self.name = name
        # self.age = age
        # self.sex = sex
        self.score = 0

    def choose_course(self, course):
        self.course = course


class Teacher(Person):
    def __init__(self, name, sex, age, level):
        super().__init__(name, sex, age)
        self.level = level


class Course(object):
    def __init__(self, name, price, circle_time):  # 在java中构造方法,跟类名同名的方法
        self.name = name
        self.price = price
        self.circle_time = circle_time

    def tell_info(self):  # 打印课程信息
        print('课程名:%s,价格是:%s,周期是:%s' % (self.name, self.price, self.circle_time))


# 造出两个学生对象
zhangsan = Student('张三', '男', 19)
lisi = Student('李四', '女', 20)

# 造出两门课程来
linux = Course('Linux从入门到放弃', '19800', '6个月')
python = Course('Python从入门到入坑', '21800', '6个月')

# 张三选择linux这门课
# zhangsan.choose_course(linux)
zhangsan.choose_course(python)

# 打印一些张三选择课程的信息
zhangsan.course.tell_info()

1.1 选课系统之学生选课(选多门)

class Person(object):  # 基类
    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex


class Student(Person):
    def __init__(self, name, sex, age):
        super().__init__(name, sex, age)  # 等同于下面三句话
        self.score = 0
        # 初始化的时候,初始化课程列表
        self.course=[]

    def choose_course(self, course):
        if course not in self.course:  # 相当于zhangsan.course
            self.course.append(course)
            print('选择%s成功'%course.name)
        else:
            print('您已经选择过这门课程了')


class Teacher(Person):
    def __init__(self, name, sex, age, level):
        super().__init__(name, sex, age)
        self.level = level


class Course(object):
    def __init__(self, name, price, circle_time):  # 在java中构造方法,跟类名同名的方法
        self.name = name
        self.price = price
        self.circle_time = circle_time

    def tell_info(self):  # 打印课程信息
        print('课程名:%s,价格是:%s,周期是:%s' % (self.name, self.price, self.circle_time))


# 造出两个学生对象
zhangsan = Student('张三', '男', 19)
lisi = Student('李四', '女', 20)

# 造出两门课程来
linux = Course('Linux从入门到放弃', '19800', '6个月')
python = Course('Python从入门到入坑', '21800', '6个月')

# 张三选择linux这门课
# zhangsan.choose_course(linux)
zhangsan.choose_course(python)
zhangsan.choose_course(python)
zhangsan.choose_course(linux)

# 打印一些张三选择所有课程的信息
for course in zhangsan.course:
    course.tell_info()

1.2 老师修改学生成绩(多门课成绩)

class Person(object):  # 基类
    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex


class Student(Person):
    def __init__(self, name, sex, age):
        super().__init__(name, sex, age)  # 等同于下面三句话
        self.score = {}  # key是课程名,value是分数
        # 初始化的时候,初始化课程列表
        self.course=[]

    def choose_course(self, course):
        if course not in self.course:  # 相当于zhangsan.course
            self.course.append(course)
            print('选择%s成功'%course.name)
        else:
            print('您已经选择过这门课程了')


class Teacher(Person):
    def __init__(self, name, sex, age, level):
        super().__init__(name, sex, age)
        self.level = level

    def change_score(self,course_name,score,obj):
        obj.score[course_name]=score

class Course(object):
    def __init__(self, name, price, circle_time):  # 在java中构造方法,跟类名同名的方法
        self.name = name
        self.price = price
        self.circle_time = circle_time

    def tell_info(self):  # 打印课程信息
        print('课程名:%s,价格是:%s,周期是:%s' % (self.name, self.price, self.circle_time))


# 造出张三这个学生对象
zhangsan = Student('张三', '男', 19)
# lisi = Student('李四', '女', 20)

# 造出两门课程来
linux = Course('Linux从入门到放弃', '19800', '6个月')
python = Course('Python从入门到入坑', '21800', '6个月')

# 张三选择linux和python这两门课
zhangsan.choose_course(python)
zhangsan.choose_course(linux)


# 老师给张三linux打30分,python打90分
egon=Teacher('egon','男',18,'高级讲师')
egon.change_score(linux.name,30,zhangsan)
egon.change_score(python.name,90,zhangsan)


# linux 打错了,改成60分
egon.change_score(linux.name,60,zhangsan)
# 打印张三分数
print(zhangsan.score)

2.封装

'''
    面向对象三大特征之封装
    1.什么是封装

        生活中的封装 类似工厂  拿个纸箱,装入一堆产品,拿胶带封起来
        在程序中,封装指的是将内容隐藏起来, 在面向对象中有什么内容可以被隐藏?,就是属性和方法

        注意:封装绝不是单纯的隐藏
        封装是指,隐藏内部实现细节,对外提供使用接口

    2.为什么要封装
        1.提高安全性   (例如:cpu频率  缓冲区大小,电脑,手机,汽车,收音机)
            对于封装属性而言,是通过给访问和修改增加额外的逻辑判断来实现的
        2.封装是为了明确区分内部和外部
        3.对于封装方法而言是为了隔离复杂度


    3.如何使用封装
        在属性或方法名称前 加上两个下划线,就可以将其设置为私有的
        另外补充: python中权限只有两种,公开(谁都能访问)的和私有(只有自己能访问)的
        属性的封装,通常需要提供相应的设置器和访问器

    4.什么时候用
        当一个类中有某些属性或方法 不应该让外界直接访问,那就应该将其进行封装
    5.封装的实现原理
        本质上python并没有强行限制你的访问,而是通过语法转换来实现的封装
        会将__开头的属性 转换为 _类名__属性名


    6.封装的特点
    被隐藏的内容 在内部是可以直接访问,外部无法访问
    子类无法覆盖和访问父类的私有属性和方法

    7.面向对象封装:在类内部(属性/方法) 在前面加__,表示隐藏,只能在内部用,外部使用不到
    模块中也可以隐藏属性,在属性前加_,只是在模块内部使用,不期望外部的使用
     from s1 import *  导入不进来
     from s1 import __name
     print(_name)
     print(__name)
'''

# 选课系统之学生选课(选一门)
class Student:
    def __init__(self,name,sex,age,idCard):
        self.name = name
        self.age = age
        self.sex = sex
        self.__idCard = idCard
    def say_hi(self):
        print("hello i am %s age is : %s sex is %s" %
              (self.name,self.age,self.sex))

    def test(self):
        print(self.__idCard)

    # 可以使用方法 将内部封装的内容返回出去
    def get_idCard(self):
        return self.__idCard

    # 如果直接返回的话 就没必要设置隐藏了 ,谁都可以通过调用方法来获取,我们再方法中加上自己的判断逻辑
    def get_idCard2(self,pwd): # 如果密码正确我就给你身份证号码
        if pwd == "1111":
            return self.__idCard
        else:
            print("滚 你没有资格知道我的身份证...")

    def set_idCard(self,pwd,new_idCard): # 如果密码正确就允许修改
        if pwd == "1111":
            self.__idCard = new_idCard
        else:
            print("滚 你没有资格修改我的身份证...")

stu = Student("步惊云","男",20,"3206661998445132")
stu.say_hi()

# print(stu.__idCard)  # 加上__也访问不了

# stu.test() # 但在内部是可以访问的

# idcard = stu.get_idCard()
# print(idcard)
# 即实现了隐藏  又提供了访问的接口 这就是封装的用法
# idcard = stu.get_idCard2("1111")
# print(idcard)


# 身份证填错了 要修改
# stu.__idCard = "123" # 这样是无法修改原来的身份证信息的 而是添加了新的属性
#
# print(stu.__idCard)
# print(stu.get_idCard2("1111"))

# 调用方法来修改隐藏的属性
stu.set_idCard("1111","xxxxxxxxxxxxxxxxxx")

print(stu.get_idCard2("1111"))


# 总结:对于被隐藏的属性  访问和修改都需要通过方法 get用于获取  set用于设置(也称之为设置器和访问器)

相关文章

  • 面向对象

    面向对象:OOP 面向对象三大特性

  • Java学习day-07:面向对象

    一、面向过程和面向对象 1.面向对象与面向过程的区别: 面向对象具有三大特征;封装,继承,多态;面向对象与面向过程...

  • Java 工程师成神之路 | 2019正式版

    摘要:什么是面向对象 基础篇 01面向对象 → 什么是面向对象 面向对象、面向过程 面向对象的三大基本特征和五大基...

  • Java从入门到入坑(基础篇)

    01:面向对象 1:什么是面向对象 面向对象,面向过程 面向对象的三大基本特征和五大基本原则 三大特性:封装,继承...

  • 面向对象编程

    面向对象编程 一、面向对象和面向过程 二、类和对象 三、内存图 四、构造方法 五、关键字 六、面向对象的三大特征 ...

  • JS面向对象精要(二)_函数

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(三)_理解对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(四)_构造函数和原型对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(五)_继承

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • 第七篇 面向对象编程

    一、复习 二、time模块的补充 三、面向对象 四、初始面向对象和类 五、面向对象之间的交互 六、面向对象的组合 ...

网友评论

      本文标题:面向对象 三

      本文链接:https://www.haomeiwen.com/subject/igjafltx.html