上一节我们介绍了,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'

Python面向对象-访问权限public和private的更多相关文章

  1. C# 成员默认访问权限(public、private、protected、internal)

    C# 成员默认访问权限(public.private.protected.internal) 来源 https://www.cnblogs.com/yezongjie/p/20181121Access ...

  2. Java的访问权限(public并不等于默认)

    一共有四种访问权限,对应四个范围 1.private :只有本类内可以使用,即使是子类也没权使用 2.protect :子类和友好类能够使用,继承中经常用到 3.默认值,(就是什么都没写),只有同包名 ...

  3. Ruby中访问控制符public,private,protected区别总结

    重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this cla ...

  4. 访问权限,public private protected

    百度经验这篇文章很不错:https://jingyan.baidu.com/article/bad08e1e8e9a9b09c851219f.html

  5. java类成员访问权限总结(private,default,protected,public)

  6. Python面向对象-访问限制

    在Class内部,可以有字段,方法和属性,而外部代码可以通过直接调用实例变量的方法来操作数据, (1)私有普通字段 比如对于下面的Student类,name字段可以在外面通过对象进行直接访问: cla ...

  7. Python变量访问权限控制

    oop1.py文件代码 # user/bin/python class Foo: def bar(self): print('ok') def hello(self, name): print(&qu ...

  8. 访问权限PPP(public、private、protected、default)之成员变量、成员变量权限解析

    首先,我们需要清楚一下方法是由哪些部分构成的: [权限修饰符列表][别的修饰符列表] 返回值类型 方法名(参数列表){   方法体:} 然后我们需要知道成员变量和成员方法访问有几种情况:1.当前包同一 ...

  9. 访问权限系列一(public/private/protected/default):成员变量

    通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...

随机推荐

  1. python3 之 内置函数range()

    一.语法: range(stop) range(start,stop,step) start:计数从start开始,默认是从0开始.eg:range(5)等价于range(0,5) stop:计数到s ...

  2. linux目录相关操作

    mkdir:新建目录 mkdir [-mp] 目录名称 -m:配置文件权限,直接设置,不需要看默认权限(umask) -p:递归创建目录 rmdir:删除空目录 rmdir [-p] 目录名称 -p: ...

  3. ctf线下赛中关闭非法用户shell脚本

    linux中三类用户:根用户,虚拟用户,普通用户. 其中普通用户的UID一般介于500-6000之间. #!/bin/bash for uid in $( cat /etc/passwd | cut ...

  4. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(2)- Boot配置(ISP_Pin, OTP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRTx ...

  5. 09-kubernetes configMap secret

    目录 配置容器化应用配置的方式 命令创建和测试configMap 创建一个Pod 挂在测试 命令行文件类创建方式 创建Pod测试 创建后测试 贴近实际进行测试 创建后测试 secret 举例测试 ge ...

  6. java 小程序分析:参数传递

    public class Test{ public static void main (String [] ABC){ StringBuffer a = new StringBuffer(" ...

  7. selenium处理iframe和动作链

    selenium处理iframe和动作链 iframe iframe就是一个界面里嵌套了其他界面,这个时候selenium是不能从主界面找到子界面的属性,需要先找到子界面,再去找子界面的属性 动作链( ...

  8. unicode和utf-8编码区别

    以前使用Python2,一直为中文烦恼,也不知道为什么开头就要声明#coding=utf-8,后来用了Python3,发现就不用这样了,还是想彻底弄懂下这是为什么. 先讲asc码  每个 ASC码占一 ...

  9. NSURLConnection发送GET请求

    // ViewController.m // 04-掌握-NSURLConnection发送GET请求 // // Created by xiaomage on 16/2/22. // Copyrig ...

  10. Android手机打造你的Python&Java开发工具!

    开发者桌面 之前写过一篇文章:将Android手机打造成你的python开发者桌面 在安卓手机上通过Termux软件,创建一个模拟Linux系统,它的好处就是无需root,即可在手机中编写Python ...