来源:python中国网 时间:2019-06-06

  封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。适当的封装可以让程式码更容易理解与维护,也加强了代码数据的安全性。具体哪些属性和方法会被封装起来这完全看业务情形。

  Python并没有提供类似于其他语言的private等修饰符,因此Python并不能真正支持隐藏,为了隐藏类中的成员,Python玩了一个小技巧:只要将Python类的成员命名为以双下画线开头的,Python就会把它们隐藏起来。

  但是,Python会“偷偷”地改变以双下画线开头的方法或者属性名,会在这些方法名前添加单下画线和类名,所以并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形。

# ‐*‐ coding: utf‐8 ‐*‐

class User:
    __name = '老王'  # 类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__name,会变形为_User__name

    def __init__(self):
        self.__age = 10  # 变形为self._A__age

    def __input_pwd(self,pwd):  # 变形为_A__foo
        if len(pwd) < 6:
            print("密码太短")

    def set_pwd(self,pwd):
        self.__input_pwd(pwd)  # 只有在类内部才可以通过__input_pwd的形式访问到.



u1  = User()
u1.set_pwd('123')
# set_pwd会对用户设置的 密码进行控制,只有符合条件的才允许设置。
print(User._User__name)
User.__name


D:installpython3python.exe D:/pyscript/test/test.py
密码太短
老王
Traceback (most recent call last):
  File "D:/pyscript/test/test.py", line 21, in 
    User.__name
AttributeError: type object 'User' has no attribute '__name'

Process finished with exit code 1


  封装需要从两个方面来考虑:

  1.将对象的属性和实现细节隐藏起来,不允许外部直接访问。

  2.把方法暴露出来,让方法来控制对这些属性进行安全的访问和操作。

  封装的优点

  1.良好的封装能够减少耦合。

  2.类内部的结构可以自由修改。

  3.可以对成员变量进行更精确的控制。

  4.隐藏信息,实现细节。

  封装原则

  1.将不需要对外提供的内容都隐藏起来;

  2.把属性都隐藏,提供公共方法对其访问。