封装
封装
-
什么是封装?
- 就是把属性或者方法装起来
-
广义上的封装
- 把属性和方法装起来,外面不能直接调用,要通过类的名字调用
-
狭义上的封装
-
把属性和方法藏起来,外面不能调用,只能在内部调用
-
给一个名字前面加上双下划线的时候,这个名字就变成了一个私有的(私有的实例变量/私有的属性)
-
所有的私有内容或者名字都不能在类的外部直接调用,只能在类的内部使用
-
所有的私有化都是不让用户在外部调用类中的某个名字
-
私有的静态变量和方法不能被继承
-
私有化的好处:
- 如果完成私有化,那么这个类的封装度就更高了,封装度越高各种属性和方法的安全性也越高,但是代码越复杂
-
私有使用的三种方法(封装的语法)
-
私有实例属性/实例变量
- 不能看,也不能改
class User: def __init__(self,name,password): self.name=name self.__password=password user=User('wangminmin',123456) # print(user.__password) #报错
- 只能看,不能改
class User: def __init__(self,name,password): self.name=name self.__password=password def get_pwd(self): #用户不能改,只能看 私有+某个get()方法实现的 return self.__password user=User('wangminmin',123456) print(user.get_pwd())
- 能看,也能改
class User: def __init__(self,name,password): self.name=name self.__password=password def get_pwd(self): #用户不能改,只能看 私有+某个get()方法实现的 return self.__password def change_pwd(self): #表示用户必须调用我们自定义的修改方式来进行变量的修改 私有+change方法实现 pass #满足某种条件 user=User('wangminmin',123456)
-
私有静态变量
class User(object): __Country='China' #类的内部可以调用,外部不能调用 def func(self): return User.__Country # print(User.__Country) #不能打印 user=User() print(user.func()) #可以打印
-
私有方法
import hashlib class User: def __init__(self,name,password): self.name=name self.__password=password def __get_hashlib(self): md5=hashlib.md5(self.name.encode('utf-8')) #加盐 md5.update(self.__password.encode('utf-8')) #加密 return md5.hexdigest() def get_pwd(self): return self.__get_hashlib() def change_pwd(self): pass #满足某种条件 user=User('wangminmin','123qwe456') print(user.get_pwd())
class User(object): __Country='China' print(User.__dict__) # {'__module__': '__main__', '_User__Country': 'China', '__dict__': <attribute '__dict__' of 'User' objects>, # '__weakref__': <attribute '__weakref__' of 'User' objects>, '__doc__': None} # 在外部将__Country :'China'变成了 '_User__Country': 'China'所以直接写调用不到
- 在类的内部使用的时候,自动的把当前的这句话所在的类的名字拼在私有变量的前面完成变形
-
私有的内容能不能被子类使用呢?
-
父类私有的内容不能被子类使用,因为在父类中找的是
__func
但是由于私有变形已经成为了___Foo__func
class Foo(object): def __init__(self): self.__func() def __func(self): print('in Foo') class Son(Foo): def __func(self): print('in Soo') Son() # 得 # in Foo
-
-
类中变量的级别在其他语言的数据的级别都有哪些?在python中有哪些?
- public 共有的 类内类外都能用,父类子类都能用 python支持
- protect 保护的 类内子类能用,类外不能用 python不支持
- private 私有的 类内能用,本类能用,其他地方不能用 python支持
-