zoukankan      html  css  js  c++  java
  • Python面向对象-访问权限public和private

    上一节我们介绍了,Class内部可以有属性和方法,外部代码通过直接调用实例的方法来操作数据,这样就可以隐藏内部的逻辑实现;同时,外部代码还是可以自由的修改实例的属性和增加方法。

    但是有时候,我们不想这样呢?即不让内部属性被外部访问。

    可以在属性的名称前面加上两个下划线__。如果一个变量以__开头,就变成了一个私有变量private,只有内部可以访问。

    修改一下Student类:

    class Student(object):
        def __init__(self,name,score):
                self.__name = name
                self.__score = score
        def print_stu(self):
                print('姓名:%s,成绩%s'%(self.__name,self.__score))

    现在已经无法从外部访问实例.__name和实例.__score了:

    >>> wc = Student('wc',66)
    >>> wc.__name
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Student' object has no attribute '__name'

    如果我们的确需要从外部获取name和score呢?通常的做法,是给类增加get的方法:

    class Student(object):
        def __init__(self,name,score):
                self.__name = name
                self.__score = score
        def print_stu(self):
                print('姓名:%s,成绩:%s'%(self.__name,self.__score))
        def getName(self):
                return self.__name
        def getScore(self):
                return self.__score

    同理,我们还可以给该类增加setName的方法,使得外部代码可以先修改name。同时,我们还可以在这些方法中增加健壮性检查,避免传入错误的参数。

    注意:python中,变量名类似于__xxx__的,是特殊变量,是可以直接访问的,并不是私有变量。有些时候,可能会出现_name这样的变量,这样的变量也是可以访问的,但是约定俗成:可以被访问,但是最好不要随意访问。

    问题又来了,类似于__xxx双下划綫开头的变量,真的不能被外部访问吗?其实也可以访问。python解释器对外会把__name变量变成_Student__name,你按照实例.__name当然访问不了了,这时可以使用实例._Student__name来访问__name变量:

    >>> wc._Student__name
    'wc'

    但是,不同版本的python解释器可能会把__name改成不同的变量名,强烈建议你程序不能这么干。

    再来看一个例子:

    >>> ly = Student('ly',55)
    >>> ly.getName()
    'ly'
    >>> ly.__name = 'haha'
    >>> ly.__name
    'haha'

    表面上,外部代码好像成功的设置了__name变量,其实不是的。这里的__name变量和class内部的__name变量并不是一个变量。验证:

    >>> ly.getName()
    'ly'
  • 相关阅读:
    戴尔笔记本win8.1+UEFI下安装Ubuntu14.04过程记录
    socketpair的使用
    上传App时遇IDFA错误问题
    1-4标签的语法
    TCP协议中的三次握手和四次挥手(图解)
    TsFltMgr.sys系统蓝屏的原因就在于QQ电脑管家!
    STL vector使用方法介绍
    史上最强视频站点真实地址解析
    .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
    ASP.NET——验证码的制作
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/8516277.html
Copyright © 2011-2022 走看看