一种是狭义上的封装:一些细节上的封装。把属性和方法藏起来,外面不能调用,只能在内部偷偷调用。
class A: a = 1 b = 2 def fun(self): print(\'in fun\') print(a)上面是打印不出来a的值的。这样已经是不可以调了,某种意义上是已经封装了。需要通过类的名字去调用。这个从某种意义上说已经封装了。我们之前写的很多的例子实际上都是广义上的封装。
现在我们学习一下狭义上的封装。
狭义上的封装可以分为三种。
第一种是实例变量(实例属性)的封装(私有化)。给一个名字前面加上了双下划线的时候,这个名字就变成了一个私有的。所有的私有的内容或者名字都不能在类的外部调用,只能在类的内部使用了。但是我们可以设置方法,使得外部可以获取到私有的实例变量,和改变私有的实例变量的值。
1.不能看不能改
class User: def __int__(self, name, passwd): self.user = name self.__pwd = passwd zhouqian = User(\'alex\',\'sbsbsb\') print(zhouqian.pwd)#报错2.只能看,但是不能改
class User: def __int__(self, name, passwd): self.user = name self.__pwd = passwd def get_pwd(self): # 表示的是用户不能改只能看 私有+某个get方法实现的 return self.__pwd # 通化这种方式外部可以获取到这个值,类的外部调用,获取到这个值。 zhouqian = User(\'zhouqian\',\'sbsbsb\')3.可以看,可以改
class User: def __int__(self, name, passwd): self.user = name self.__pwd = passwd # 我们这里的pwd就是一个私有的实例属性(实例变量)私有的实例变量,私有的对象属性 def get_pwd(self): # 表示的是用户不能改只能看 私有+某个get方法实现的 return self.__pwd # 通化这种方式外部可以获取到这个值,类的外部调用,获取到这个值。 def change_pwd(self,pwd): # 表示用户必须调用我们自定义的修改方式来进行变量的修改 私有+change方法实现 self.__pwd = pwd # 给一个名字前面加上了双下滑先的时候,这个名字就变成了一个私有的 alex = User(\'alex\',\'sbsbsb\') print(alex.pwd) #在前面加上__,就会影藏掉,就调用不到 print(alex.__pwd) #在前面加上__,就会影藏掉,就调用不到第二种是静态变量(静态属性)的封装(私有化)。给一个名字前面加上了双下划线的时候,这个名字就变成了一个私有的。所有的私有的内容或者名字都不能在类的外部调用,只能在类的内部使用了。但是我们可以设置方法,使得外部可以获取到私有的实例变量,和改变私有的实例变量的值。同时也有三种形式:1.不能看不能改,2.只能看,但是不能改,3.可以看,可以改。
class User: __country = \'China\' # 私有的静态变量(静态属性) def func(self): print(self.__country) # 在内的内部可以使用,在内的外部不能被调用 print(User.__country) # 在内的内部可以使用,在内的外部不能被调用 def get_contry(self): return User.__country def change_country(self): User.__country = \'hangzhou\' # print(User.country) # AttributeError: type object \'User\' has no attribute \'country\' # print(User.__country) # AttributeError: type object \'User\' has no attribute \'country\' user = User() user.func() User.func(user) User().func() print(User().get_contry()) user1 = User() user1.change_country() print(user1.get_contry()) \'\'\' 输出的结果为: China China China China China China China hangzhou \'\'\'