封装

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

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

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

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

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

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:私有的,本类的内部能用,其他都不能用

 

posted @ 2020-08-20 20:38  LGQ天  阅读(94)  评论(0编辑  收藏  举报