• day28 封装


    一、什么是封装

    封装是面向对象的三大特性中最核心的一个特性

    封装<==>整合

    二、将封装的属性进行隐藏操作

    1 如何隐藏:

    在属性钱加__前缀,就会实现一个对外隐藏熟悉的效果

    class Foo:
        __x = 10
        def __f1(self):
            print("我是f1")
    

    1.1 强行访问:

    虽然在外部我们无法访问类中被隐藏的属性,但是只要只要该属性的名字和类名就可以拼出名字_类.__属性

    print(Foo._Foo__x)
    >>>10
    

    所以可以理解为这种隐藏只是一种对属性名的变形,并不是完全无法访问。

    1.2 内部逻辑

    由上面的实验我们不由的引发一个问题,这种隐藏是在类的哪一个阶段执行的

    class Foo:
        __x = 10
        def __f1(self):
            print("我是f1")
        def f2(self):
            self.__f1()
            print(self.__x)
    
    foo_obj = Foo()
    foo_obj.f2()
    >>>我是f1
    >>>10
    

    通过测试我们可以知道在类定义阶段,我们可以用__开头去访问类中的属性,说明这种变形是在类定义阶段就产生的
    并且这种隐藏对外不对内

    三、为何要封装

    封装给我们带来了两种场景的便利

    场景1:我们需要对对象访问某些数据加以严格的条件判断

    class People:
        def __init__(self, name):
            self.__name = name
    
        def get_name(self):
            # 通过该接口就可以间接地访问到名字属性
            print(self.__name)
    
        def set_name(self,val):
            # 通过该接口就可以间接地修改名字属性
            if type(val) is not str:
                print('小垃圾,必须传字符串类型')
                return
            self.__name=val
    

    由此,我们在访问People这个类的对象内的属性时候,我们不能直接用对象.的方式去修改name,必须通过我们定义类的时候设定好的接口来实现访问和修改功能。

    场景二:隐藏函数/方法属性:目的的是为了隔离复杂度

    class ATM:
        def __card(self):  # 插卡
            print('插卡')
    
        def __auth(self):  # 身份认证
            print('用户认证')
    
        def __input(self):  # 输入金额
            print('输入取款金额')
    
        def __print_bill(self):  # 打印小票
            print('打印账单')
    
        def __take_money(self):  # 取钱
            print('取款')
    
        def withdraw(self):  # 取款功能
            self.__card()
            self.__auth()
            self.__input()
            self.__print_bill()
            self.__take_money()
    
    user_obj = ATM()
    user_obj.withdraw()
    

    ATM类有只有一个功能是取款,但是取款又需要分开很多小步骤,这些步骤只要类知道,不需要提供给使用者,这种情况就可以把它隐藏起来

  • 相关阅读:
    grid与oracle用户下oracle程序权限不一致导致无法连接ASM问题
    错误ORA-29760: instance_number parameter not specified的解决办法
    window phone webclient xml 乱码解决方法
    谈谈layout-weight
    状态栏更改颜色
    android 顶部导航栏
    android 布局抽取优化
    Kotlin版HelloWorld
    浅谈synchronized作用
    android获取Tomcat的JSON数据
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/12659939.html
Copyright © 2020-2023  润新知