zoukankan      html  css  js  c++  java
  • 封装

    封装:就是把属性或方法装起来

      广义:把属性和方法装起来,不让外面直接调用,要通过类的名字或类的对象来调用

      狭义:把属性和方法藏起来,外面根本不能调用,只能在内部偷偷调

    私有属性或方法就是在静态变量、实例属性和成员方法名前加双下划线__,不能被外部被调用,只能在内部使用

    实际上所有的私有化都是为了让用户不在外部调用类中的某个名字

    import hashlib
    class User(object):
        a = 1
        __b = 2  # 实际上 ==> _User__b = 2
    
        def __init__(self, name, pwd):
            self.username= name
            self.__pwd = pwd  # 给一个属性名前加上__就变成了私有属性
    
        def get_pwd(self):
          # 可以自定义一个方法返回self.__pwd的值,表示可以让用户看,不能改
            return self.__get_md5()
        #
        # def change_pwd(self, old_pwd, new_pwd):
        #    # 用户只有通过调用该方法才能修改私有属性
        #     if old_pwd == new_pwd:
        #         self.__pwd = new_pwd
    
        def __get_md5(self):  # ==> _User__get_md5()
            # 不想让外界直接看到__pwd的明文,将其通过md5加密,并将该方法设为私有方法
            md5 = hashlib.md5()
            md5.update(self.username.encode('utf-8'))
            md5.update(self.__pwd.encode('utf-8'))
    
            return md5.hexdigest()
    
    
    alex = User('alex', '123')
    print(alex.get_pwd())
    
    # 1.如果完成私有化,那么这个类的封装度就更高了,各种属性和方法的安全性也越高,但是代码越复杂
    
    # 2.为啥加了双下划线的名字不能从类的外部调用了?
    # print(User.__dict__) # 这里就能看到其实是Python在类的字典中将加了双下划线的属性或方法的名字做了更改
    # 那么如果确实想要调用私有属性或方法通过 类名._类名__私有方法或属性名  就可以调用
    # print(User._User__b)
    
    # 3.私有的内容不能被子类使用
    
    # 4.在其他语言中的数据的级别都有哪些?
        # public:公有的,类的内部外部都能用,父类子类都能用
        # protect:保护的,类内能用,父类子类能用,外部不能用  # python不支持
        # private:私有的,本类的内部能用,其他都不能用
  • 相关阅读:
    程序员是这样区分Null和Undefined
    JavaScript实现
    获取页面中任意一个元素距离body的偏移量
    js检测数据类型的方法你都掌握了几个?
    处理浏览器兼容你最喜欢用哪种方式
    算法竞赛入门经典 第四章 学习笔记 1
    算法竞赛入门经典 程序4-1 组合数
    算法竞赛入门经典 例题3-1 TeX中的引号
    算法竞赛入门经典 第3章 数组和字符串 学习笔记 3
    算法竞赛入门经典 第3章 数组和字符串 学习笔记 2
  • 原文地址:https://www.cnblogs.com/GOD-L/p/13537770.html
Copyright © 2011-2022 走看看