封装:就是把属性或方法装起来
广义:把属性和方法装起来,不让外面直接调用,要通过类的名字或类的对象来调用
狭义:把属性和方法藏起来,外面根本不能调用,只能在内部偷偷调
私有属性或方法就是在静态变量、实例属性和成员方法名前加双下划线__,不能被外部被调用,只能在内部使用
实际上所有的私有化都是为了让用户不在外部调用类中的某个名字
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:私有的,本类的内部能用,其他都不能用