python

当前位置:首页 > python面向对象 > 当前文章

python面向对象

面向对象的封装特性-私有属性,私有方法

2020-05-14 129赞 python中国网
每篇文章努力于解决一个问题!python高级、python面试全套、操作系统经典课等可移步文章底部。

  实际开发中,对象的某些属性或方法只允许在对象的内部被使用,不希望在类外部被访问到,这就诞生了封装的需求!这样的属性和方法我们叫他私有属性和私有方法!

  封装可以认为是一个保护,防止该类的代码和数据在外部随意访问,要访问的话必须通过严格的接口控制。

  新手可能会奇怪定义类就是让使用的,为何还要封装保护起来?其实封装与否要结合实际业务场景。比如一个类的属性涉及到账户余额信息,那肯定不能随便修改,所以代码层面要提供一套安全的机制。哪些属性和方法会被封装起来完全看业务情形。

  php语言有private修饰符来定义私有属性和方法,python并没有类似的关键字。python中要实现这个效果可以把类的成员命名为以双下画线开头,这样就不能直接访问。

  实际上Python并不能真正限制访问,Python只是偷偷改变以双下画线开头的方法或者属性名,会在这些方法名前添加单下画线和类名,所以python并不是真正的限制外部访问,只是一种语法上的变形

# -*- coding: utf-8 -*-


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

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

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

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


if __name__ == "__main__":
    u1 = User()
    print(User._User__name)
    u1.set_pwd('12345678') 
    # 外部访问
    u1._User__input_pwd('66666666')

老王
密码为 12345678
密码为 66666666


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

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

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

  封装的优点

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

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

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

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

  封装原则

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

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

文章评论

面向对象的封装特性-私有属性,私有方法文章写得不错,值得赞赏