一、知识点

在一个模块中,我们可能会定义很多函数和变量。但有的函数和变量我们希望能给别人使用,有的函数和变量我们希望仅仅在模块内部使用,so?

我们可以通过定义该函数、变量是公开的还是私有的来达到该目的。

在python中,是通过下划线“_”前缀来实现的。 public:公开的。正常的函数和变量名为此类型,可以被直接引用。比如变量abc、PI等; 特殊变量:格式为__xxx__ ,以__开头、以__结尾。可以直接被引用,但是有特殊用途。比如 __author__ 、__name__就是特殊变量。一般自己定义的变量不要用这种变量名。 private:私有的、非公开的,格式类似于_xxx_ 和__xxx,例如__num。

不应该被直接引用,只有内部可以访问,外部不能访问。

不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

二、举例说明

在Class类内部,可以有属性和方法。而外部代码可以通过直接调用实例变量的方法来操作数据,隐藏了内部复杂逻辑。但是,外部代码还是可以自由地修改一个实例的属性。例如: >>>b.score

99

>>>b.score = 59

>>>b.score

59

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线“__”,变成私有变量,如下: class Student(object):

def __init__(self, name, score):

self.__name = name

self.__score = score

def print_score(self):

print('%s: %s' % (self.__name, self.__score))

尝试在外部对属性进行访问,发现会报错,因为私有变量,不能被外部访问。 >>> bart = Student('Bart Simpson', 98)

>>> bart.__name # 私有变量:不能被外部访问

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'Student' object has no attribute '__name'

但是,如果外部代码要获取name和score怎么办?

给Student类增加获取属性的方法:get_name()和get_score(),如下: class Student(object):

...

def get_name(self):

return self.__name

def get_score(self):

return self.__score

如果外部代码修改score怎么办?可以再给Student类增加设置方法:set_score(): ...

def set_score(self, score):

# 避免传入无效参数

if 0 <= score <= 100:

self.__score = score

else:

raise ValueError('bad score')

那作为双下划线开头的私有实例变量是不是一定不能从外部访问呢?其实也不是。

不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以仍然可以通过_Student__name来访问__name变量。 >>> bart = Student('Bart Simpson', 98)

>>> bart.get_name()

'Bart Simpson'

>>> bart.__name = 'New Name' # 给bart新增的__name变量

>>> bart.__name # !与class内部的__name变量不是一个变量!

'New Name'

>>> bart.get_name() # get_name()内部返回self.__name (_Student__name)

'Bart Simpson'

表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。

所以python并没有一种方法可以完全限制访问private的函数或变量,所以不是“不能被直接引用”,从编程的习惯上不应该引用private函数或变量。那他们的用处呢?

例如: def _private_1 (name):

return 'hello,%s ' % name

def _private_2 (name):

return 'hi , %s ' % name

def greeting(name):

if len(name) > 3:

return _private_1 (name)

else:

return _private_2 (name)

在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了。这样,调用greeting()函数不用关心内部的私有函数的细节。

这是一种非常有用的代码封装和抽象的方法,即:外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。

三、完整代码 class Student(object):

def __init__(self, name, score):

self.__name = name

self.__score = score

def print_score(self):

print('%s: %s' % (self.__name, self.__score))

def get_name(self):

return self.__name

def get_score(self):

return self.__score

def set_score(self, score):

# 避免传入无效参数

if 0 <= score <= 100:

self.__score = score

else:

raise ValueError('bad score')

def _private_1 (name):

return 'hello,%s ' % name

def _private_2 (name):

return 'hi , %s ' % name

def greeting(name):

if len(name) > 3:

return _private_1 (name)

else:

return _private_2 (name)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

python类的成员没有访问控制限制_Python 访问限制 private public的详细介绍相关推荐

  1. python中if判断语句的用法_Python if判断语句的用法详细介绍

    1.if 条件语句语法 if 条件: 条件成立执行的代码1 条件成立执行的代码2 ...... 2.快速体验if条件语句 下面通过一个实例来体验if条件语句 # 条件成立执行代码1和2,条件不成立时执 ...

  2. python类中成员的的调用

    python类中成员的调用 python类中的方法到底到底是方法还是函数取绝于调用者, 当类名调用这个方法时他是一个函数 class Foo(object):def f1(self):print(&q ...

  3. python类的析构方法是什么_python类的析构方法是什么_python类析构

    python __del__ 转自:http://blog.csdn.net/bbdxf/article/details/25774763 最近学习<Python参考手册>学到Class部 ...

  4. python类的成员函数_Python实现动态添加类的属性或成员函数的解决方法

    某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或 ...

  5. Python类的成员

    类的成员 类的内置成员 code:_10class_buildin_member.py # ****************************************************** ...

  6. [转载] python类内部成员的访问及外部访问(入门)

    参考链接: 在Python中更改类成员 class Student(): school = "xcxy"                    # 类属性 __major = &q ...

  7. python类的使用的生物学应用_python类的使用的生物学应用_Python 类的使用

    类的使用 文档化函数: 在函数的开头写下字符串,它会作为函数的一部分运行存储,这称为文档字符串(常用来描述该函数的信息). 如下: def test(x,y): u""" ...

  8. python类的使用的生物学应用_Python 类的使用

    类的使用 文档化函数: 在函数的开头写下字符串,它会作为函数的一部分运行存储,这称为文档字符串(常用来描述该函数的信息). 如下: def test(x,y): u""" ...

  9. python类的封装是什么意思_python封装是什么意思

    python封装是什么意思 发布时间:2020-09-21 09:17:42 来源:亿速云 阅读:97 作者:Leah python封装是什么意思?相信很多没有经验的人对此束手无策,为此本文总结了问题 ...

最新文章

  1. 使用EXE4J将JAR包转换为EXE文件
  2. 将矩阵转为一行_LeetCode1253:矩阵重构
  3. php empty,isset,is_null比较
  4. David Silver强化学习公开课】-2:MDP
  5. 迁移数据库到SQL on Linux Docker
  6. python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)
  7. c语言基础编程题讲解,C语言入门例题讲解
  8. shell time 计算
  9. Grammarly SCI语法检查总结
  10. MySQL 如何优化大分页查询?
  11. 数据分析师面试题目_数据分析师面试题目
  12. meterial design 5.0 新增控件介绍及使用方法
  13. 几何图形变化(Codevember)
  14. tvp5150 gm7150配置
  15. 基于51单片机的关于7SEG-MPX8-CA,7SEG-MPX6-CA,7SEG-MPX4-CA的使用
  16. C++语言篇 第一章 二进制及计算机基础
  17. 易编远航程序防封防检测方法
  18. 彩云小译怎么翻译网页_彩云小译插件,中英双语对照网页翻译,支持视频字幕翻译...
  19. 几种快速传输大文件的方式
  20. 红米路由器ac2100怎样设置ipv6_【路由刷机】红米小米 AC2100 Windows下刷Padavan固件小小白教程、升级固件...

热门文章

  1. java 获取线程某个_Java中如何唤醒“指定的“某个线程
  2. jmap 定时生成linux,linux – 创建heapdumps的替代方案,性能比jmap更高?
  3. Inject Dll 过程
  4. django学习----01HelloWorld
  5. 利用ptrace和memfd_create混淆程序名和参数
  6. Java的native方法返回数组return Array(C语言)
  7. python argparse_Python 命令行之旅:深入 argparse(二)
  8. BIO,NIO和AIO的区别
  9. mysql如何管理innodb元数据_1.1.20 可动态关闭InnoDB更新元数据的统计功能
  10. delve应该安装到哪_消防水炮安装高度为多少米标准