zoukankan      html  css  js  c++  java
  • OPP的三大特征之封装总结

    '''
    封装:
    1.什么是封装?
    封装是把什么东西装到容器中,再封闭起来
    与隐藏有相似之处,但不是单纯的隐藏
    官方解释:封装是指对外部隐藏实现细节,并提供简单的使用接口

    封装的好处:
    1.提高安全性
    2.隔离复杂性

    python中的属性访问权限
    1.公开的(默认)在任何地方都能访问到
    2.私有的,仅在内部可以使用

    如何封装
    使用特殊语法:要给因隐藏的变量名称前面加上两个下划线__ 使其变成私有的
    如下例'''
    '''
    class Person:
    def __init__(self,name,sex,age,id_card):
    self.name = name
    self.sex = sex
    self.age = age
    self.__id_card = id_card

    def say_hi(self):
    print('hello girl,my name is %s ,sex:%s age:%s id_card:%s '
    % (self.name,self.sex,self.age,self.__id_card ))

    p1 = Person('Egon','man',18,1232323124214)
    p1.say_hi()
    # print(p1.__id_card) #外部无法访问私有的内容

    '''

    # 封装方法
    # 使用场景:一些方法存在是为了完成其他的功能,这些方法不应该提供给外界使用,例如汽车发动机中的点火功能
    # 同样,当一个功能(函数)中的代码太多时,我们需要将其拆封成若干不同的小函数,这些小函数就不应该提供给外界使用
    # 因此也需要对函数进行封装,如下例
    # class PC:
    # def boot(self):
    # self.__read_rom()
    # self.__boot_bios()
    # self.__read_opt()
    # self.__boot_gui()
    # print('亲,早上好,电脑启动成功啦,美好的一天从清晨开始')
    #
    # def __read_rom(self):
    # print('正在读取rom数据')
    # def __boot_bios(self):
    # print('正在启动bios系统')
    # def __read_opt(self):
    # print('正在读取并执行操作系统指令')
    # def __boot_gui(self):
    # print('正在启动用户界面')
    # comp1 = PC() # 对电脑的启动顺利做了封装,否者就会出现问题
    # comp1.boot() # 正常启动电脑

    # comp1.__read_opt() #此时,再执行就会出现问题,对这些功能都进行了封装,

    '''
    # 访问器和设置器
    # 私有属性,外界完全无法访问,就会变得毫无意义
    # 因此我们可以定义访问方法和设置方法,也称之为访问器 和 设置器
    # 1.提供私有属性的访问权限
    # 2.增加额外的逻辑判断
    # 如下例
    '''
    # class Person:
    # def __init__(self,name,age,id_card):
    # self.name = name
    # self.age = age
    # self.__id_card = id_card
    #
    # def say_hi(self):
    # print('你好,我叫%s,今年%s岁,我的身份证号是%s,我是一个逗比' % (self.name,self.age,self.__id_card))
    #
    # # 访问器
    # def get_id_card(self,pwd):
    # if pwd == '123':
    # return self.__id_card
    # else:
    # print('密码错误或您没有访问权限')
    #
    # # 设置器
    # def set_id_card(self,new_id):
    # if len(new_id) == 3 or len(new_id) == 5:
    # self.__id_card = new_id
    # else:
    # print("身份证格式错误!")
    #
    # p1 = Person('林海峰',89,123)
    # print(p1.get_id_card('123')) 获取id_card

    # p1.set_id_card('12345') # 修改id_card的原来属性
    # print(p1.get_id_card('123'))
    # print(p1.name)

    '''
    property 装饰器
    # 以上就是访问器和修改器,但是也存在问题?
    # 访问和修改私有属性的写法与普通属性的写法不一致,这样对于使用者而言就变得复杂了
    '''
    # class Person:
    # def __init__(self,name,id_card):
    # self.name = name
    # self.__id_card = id_card
    #
    # # 获取私有属性
    # @property
    # def id_card(self):
    # return self.__id_card
    #
    # # 修改私有属性
    # @id_card.setter
    # def id_card(self,new_id):
    # self.__id_card = new_id
    #
    # # 删除私有属性
    # @id_card.deleter
    # def id_card(self):
    # print("不好了 你要删除身份证了")
    # self.__dict__.pop("_Person__id_card")
    #
    #
    # p1 = Person('deng',12345)
    # print(p1.name) # name 是普通属性
    # print(p1.id_card) # id_card 是私有属性,但是访问方式都是一致的

    # p1.id_card = "12345" #设置私有属性
    # print(p1.id_card)

    # del p1.id_card # 删除私有属性
    # print(p1.__dict__)
    # print(p1.id_card)
    # print(p1._Person__id_card)




    """
    实现封装的远原理
    python是通过变形的方式 来完成私有化操作
    具体:把双下划线开头的名字 在名字前添加_类名

    发生变形操作是在定义阶段就发生了并且只发生一次

    默认情况下 子类是无论是类内部还是外部都不能访问父类的私有属性的 当然你可以强行访问

    """
    # class Person:
    # def __init__(self,id):
    # self.__id = id
    # self.name = "bgon"
    #
    # def __test(self):
    # pass
    #
    # # p1 = Person("123")
    # # print(p1.__dict__)
    # # print(p1.__id)
    # # print(Person.__dict__)
    # Person.__a = 1
    # print(Person.__dict__)
    #
    # class A:
    # __age = 20
    #
    # class B(A):
    # def func(self):
    # # print(self.__age)
    # print(super().__age)
    # pass
    #
    # # print(A.__age)
    # # print(B._A__age)

    # b = B()
    # b.func()

















  • 相关阅读:
    JS常用自定义方法
    mybatis like用法
    设计模式之前之UML
    DSU模板(树的启发式合并)
    【hihocoder编程练习赛9】闰秒
    静态链接与动态链接的区别【转】
    pragma指令详解(转载)
    Crawl(2)
    Crawl(1)
    Treap
  • 原文地址:https://www.cnblogs.com/dengyanchuan/p/10409040.html
Copyright © 2011-2022 走看看