zoukankan      html  css  js  c++  java
  • Python----面向对象---封装的意义

    一、封装数据属性、明确区分内外:示例代码如下:

     1 class People:
     2     def __init__(self, name, age):
     3         self.__name = name
     4         self.__age = age
     5 
     6     def tell_info(self):
     7         print('Name:<%s> Age<%s>' % (self.__name, self.__age))
     8 
     9 p = People('egon', 18)
    10 p.tell_info()
    11 
    12 结果为:
    13 Name:<egon> Age<18>

    可以防止外部直接修改隐藏属性,并且提供了一个接口,按照固定的格式向调用者输出信息

    也可以提供修改隐藏属性的接口,让调用者通过接口修改隐藏的属性,并且可以写上控制逻辑

    例如:

     1     def set_info(self, name, age):
     2         if not isinstance(name, str):
     3             print('名字必须是字符串类型')
     4             return
     5         if not isinstance(age, int):
     6             print('年龄必须是数字类型')
     7             return
     8         self.__name = name
     9         self.__age = age
    10 
    11 
    12 p = People('egon', 18)
    13 # p.tell_info()
    14 
    15 p.set_info('EGON', 18)
    16 p.tell_info()
    17 
    18 结果为:
    19 
    20 Name:<EGON> Age<18>

    可以看出,修改成功了,并且加上了控制,不让调用者随意更改

    二、隔离复杂度

    例如:

     1 class ATM:
     2     def __card(self):
     3         print('插卡')
     4 
     5     def __auth(self):
     6         print('用户认证')
     7 
     8     def __input(self):
     9         print('输入取款金额')
    10 
    11     def __print_bill(self):
    12         print('打印账单')
    13 
    14     def __take_money(self):
    15         print('取款')
    16 
    17     def withdraw(self):
    18         self.__card()
    19         self.__auth()
    20         self.__input()
    21         self.__print_bill()
    22         self.__take_money()
    23 
    24 a = ATM()
    25 a.withdraw()
    26 
    27 结果为:
    28 
    29 插卡
    30 用户认证
    31 输入取款金额
    32 打印账单
    33 取款

    用户只关注取款,至于里面怎么实现,用户并不关注

    三、扩展性高

    一个求房间面积的例子,如下:

     1 class Room:
     2     def __init__(self, name, owner, weight, length):
     3         self.name = name
     4         self.owner = owner
     5 
     6         self.__weight = weight
     7         self.__length = length
     8 
     9     def tell_area(self):
    10         return self.__weight * self.__length
    11 
    12 r = Room('卫生间', 'alex', 10, 10)
    13 print(r.tell_area())
    14 
    15 结果为:
    16 100

    调用者不关心后面的计算方式,只关心房间面积,如果要求体积,只需更改下公式,用户调用不用发生改变

  • 相关阅读:
    git 提交代码冲突解决步骤
    侯小厨的最新技术探索
    Groovy学习笔记(总索引)
    Compilation failure 找不到org.apache.http.annotation.NotThreadSafe的类文件
    Grafana 曲线图报错“parse_exception: Encountered...”
    Vue底层学习6——节点编译与属性遍历
    thanks for everything
    spring data mongodb连接
    windows docker lookup registry-1.docker.io on 192.168.65.5:53: no such host.
    antd 表单的两种校验方式
  • 原文地址:https://www.cnblogs.com/xudachen/p/8619740.html
Copyright © 2011-2022 走看看