• day27 封装


    广义上的面向对象的封装: 
      代码的保护,面向对象思想本身就是一种封装
      只让自己的对象调用自己类的方法


    狭义的封装:
      面向对象的三大特性之一,其他两个是继承和多态。
      属性和方法都可以藏起来不让你看到
     1 class Person :
     2     __key = 123                         # 私有静态属性
     3 
     4     def __init__(self,name,passwd):
     5         self.name = name
     6         self.__passwd = passwd            # 加__变成私有属性
     7 
     8     def get_pwd(self):
     9         print(self.__dict__)
    10         return self.__passwd
    11 
    12     def __get_pwd1(self):                # 定义私有方法
    13         print(self.__dict__)
    14         return self.__passwd
    15 
    16     def login(self):
    17         self.__get_pwd1()
    18 
    19 yangtuo = Person("yangtuo","tiancai")
    20 # print(alex.__passwd)                       # 私有属性在外面是调不到的
    21     # AttributeError: 'Person' object has no attribute '__passwd'
    22 print(yangtuo.__dict__)                      # 私有属性仅仅是代码级别的一小层的加密
    23 print(yangtuo._Person__passwd)                 # 通过一定的方法依然可以在外部调用私有属性,但是请不要用这种方式
    24 print(yangtuo.get_pwd())                      # 通过类内的函数方法还是可以调用出来的
    25 
    26 
    27 yangtuo.__higt = 1                            # 在类的外部这样创建是没用的,是无法成为私有属性的,哪怕你加了下划线
    28 print(yangtuo.get_pwd())
    29 print(yangtuo.__higt)                         # 因此可以在外部调用,毕竟不是私有属性嘛


    私有属性或者方法都是左边加双下划线,而且只能在内部使用,不能在外部使用
    可以定义私有的有
    对象的私有属性
    类中的静态属性
    类中的方法
    虽然你知道可以用什么方法在外部使用,但是别做就行了

    顺便在其他语言里面 分为 public protect private
    python 只有 public 和 private,用没有下划线和前面加双下划线表示区分,不需要关键字

    会用到私有概念的场景
    隐藏属性不被外部调用
    保护属性不被随便改
    保护属性不被子类继承


  • 相关阅读:
    c# webapi 在swagger里添加全局过滤器
    axios get,post请求时带headers
    svn"重新定位"提示版本库uuid不匹配
    DevExpress XtraReport
    DevExpress GridControl List绑定方式下新增行的方法
    对Dev的GridControl/GridView控件进行分组并展开操作
    DevExpress GridControl控件行内新增、编辑、删除添加选择框
    JavaScript 中的FileReader对象(实现上传图片预览)
    数据库连接情况查询
    C#代码中实现两个表(DataTable)的关联查询(JOIN)
  • 原文地址:https://www.cnblogs.com/shijieli/p/9922423.html
Copyright © 2020-2023  润新知