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:私有的,本类的内部能用,其他都不能用
  • 相关阅读:
    hadoop安全模式
    建造者模式:设计角度重温游戏中的角色
    工厂模式:工厂方法与抽象工厂的战争
    原型模式(克隆模式):浅谈浅克隆与深克隆
    单例模式:层层剖析寻找最高效安全的单例
    24种设计模式和7大设计原则
    浅谈图的存储结构与遍历
    彻底理清二叉排序树的插入、查找、删除
    浅谈顺序、折半查找
    Android定位(是否使用GPS进行定位)
  • 原文地址:https://www.cnblogs.com/GOD-L/p/13537770.html
Copyright © 2011-2022 走看看