python中不存在只能在对象内部才能访问的私有实例变量,但是有一个预定俗称的习惯,在名称前加一个前导"_"表示API中非公开部分.

因为这种约定对于私有类成员来说是一种有效的用例(避免名称与子类中名称冲突),因此python提供了有限的支持,因此python对该机制提供了有限的支持---称之为名称变形(个人翻译).所有具有指定格式的标识符__spam(至少两个前导"_",最多一个后缀"_")会被文本式的替换为_classname__spam(classname是当前类名),这种变形没有考虑标识符的位置,一旦出现在类中即完成转换

class Test1:def f1(self):self.name ="张三"self.__age = 20 #使用名称变形实现私有变量print(self.name)print(self.__age)class Test2(Test1): #继承基类Test1def f(self):print(self.name)print(self.__age)inst1 = Test1()
inst1.f1()Test2.f(inst1)

'''
输出:
张三
20
张三
AttributeError: 'Test1' object has no attribute '_Test2__age'

Test2.f(inst1), Test2类对象调用函数属性,以Test1类实例对象作为传递参数 --- 该过程与实例对象调用方法属性的底层实现过程类似

因为这里的self是inst1,上面已经初始化过其属性name和__age,因而可以正常引用(具体命名空间的查找,此处不再重述,参见其他博文)
print(self.name)正常输出 张三

但是print(self.__age)为什么就报 AttributeError: 'Test1' object has no attribute '_Test2__age'错误了呢?
参见API: --- python对私有变量的提供有限的支持: 名称变化
    9.6. Private Variables
    1.__age会被文本式的转换为_classname__age,而这里的classname是当前类,所以__age会被文本式的替换为_Test2__age,但是对于实例对象inst1来说在初始化其__age时是在Test1类中完成,因而会被文本式的替换为_Test1__age 即给实例对象inst1的局部命名空间中添加属性添加的是_Test1__age,但在引用时在其局部命名空间查找的是_Test2__age,显然是找不到的.

----------------------

第一次更新2017年4月27日09:27:29

根据上述这一点,个人理解为什么私有属性只能在类内部访问

名称变形规则: __spam会被文本式的替换为_classname__spam,classname是当前类名

1.上述已经解释,为什么不能在其他类中访问,即使把本类实例作为参数传递也是不能访问的

2.关于为什么不能在类外访问?

根据错误提示推测:

1.print(x1.__name)因为__name不是在类内部访问,所以解释器在解析名称__name时,按照普通变量名解析,而不是私有变量

查找顺序: 实例x1的局部命名空间 --> 实例对应类的局部命名空间 --> 基类局部命名空间

2.问题是查找的是__name显然在命名空间中是不存在的

3.print(x1._Test1__name)查找_Test1__name肯定是能找到的

重点来了:

如何实现在类外部访问私有成员(类变量, 类函数)?

1.访问按照名称变化规则文本式的变化后的名称即可

eg:上述print(x1_Test1__name)

----------------------

class Test1:__name = "张三"def f1(self):self.__age = 3print(self.__name)print(self.__age)def f2(self):print(self.__name)print(self.__age)inst1 = Test1()
inst1.f1()

'''
输出:

张三
    3
'''

inst1.f2()

'''
输出:

张三
    3
'''

print(Test1.__name) # AttributeError: type object 'Test1' has no attribute '__name'
print(Test1.__age) # AttributeError: type object 'Test1' has no attribute '__age'print(inst1.__name) # AttributeError: 'Test1' object has no attribute '__name'
print(inst1.__age) # AttributeError: 'Test1' object has no attribute '__age'

'''

错误原因:

私有变量只能直接或间接的在类内部访问

'''

第二次更新2017年9月10日11:14:45

1.python中的public --->无前导and尾随下划线

2.python中的protect --->仅一个前导下划线

3.python中的private --->最少两个前导和最多一个尾随下划线

图片较大,右键新窗查看

python中的私有变量相关推荐

  1. python私有变量_[Python]Python中的私有变量

    什么是private StackOverflow上有一个备受关注的问题,想必也是很多刚从Java等支持面向对象范式的编程语言转来的同学想问的:Python的类是否可以定义私有变量(private va ...

  2. python定义私有变量的方法_浅谈Python中的私有变量

    私有变量表示方法 在变量前加上两个下划线的是私有变量.class Teacher(): def __init__(self,name,level): self.__name=name self.__l ...

  3. python私有变量什么意思_浅谈Python中的私有变量

    私有变量表示方法 在变量前加上两个下划线的是私有变量. class Teacher(): def __init__(self,name,level): self.__name=name self.__ ...

  4. python定义私有变量的方法_Python类中的 私有变量和私有方法

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量. 在python中定义私有变量只需要在变 ...

  5. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  6. python是什么语言、即变量不需要显示声明数据类型-python中可以声明变量类型吗...

    变量(variable)是Python语言中一个非常重要的概念.变量的主要作用就是为Python程序中的某个值起一个名字.类似于"张三"."李四"." ...

  7. 为什么python中不需要变量名和变量类型声明?

    python是解释型语言,python的变量不需要声明,但是需要初始化,python解释器会为每个出现的对象分配内存,哪怕他们的值完全相等(注意是相等不是相同),其中变量其实通过一个标记调用内存中的值 ...

  8. python中class变量_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  9. python方法测试怀孕_在Python中测试私有方法(例外)

    在阅读了关于在Python中测试私有方法的内容之后,特别是在How do I unit test the methods in a method object?处引用了接受的答案,看来最好只测试公共接 ...

最新文章

  1. 使用单独的解决方案(类库)来开发DNN的模块,并安装、制作.dnn文件-VB版本(1)...
  2. EntityFramework附加实体
  3. arduino naon介绍_Arduino Nano 自制版
  4. Android开发:Menu选项菜单
  5. Clojure 学习入门(1) - 学习资料
  6. 关于c# 静态构造函数的说明
  7. ActiveMQ - 持久化消息与持久主题订阅
  8. php源码内网穿透,PHP DDOS源码
  9. Mysql插件HandlerSocket的应用
  10. 爱奇艺开源FASPell项目
  11. .img文件怎么打开(解压缩)
  12. 关于在控制面板上软件卸载失败的问题
  13. 艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?
  14. protobuf详细介绍和使用
  15. 小米4s真机测试运行失败
  16. 联想装win7驱动遇到问题的解决
  17. 微软发布2010年度经典MSN签名
  18. 汇编语言 标志位介绍
  19. 考研这么累,是什么让你坚持下来的?
  20. 城市规划数据—武汉市全部矢量+乡镇边界+POI数据

热门文章

  1. CSS-文字溢出的省略号显示
  2. React中的withRouter用法
  3. 从MySQL到HBase:数据存储方案转型的演进
  4. IDEA代码提示插件,GitHub Copilot,代码自动提示
  5. 哪些工业相机不需要另配备图像采集卡?
  6. 【自监督论文阅读 2】MAE
  7. SpringBoot2集成redis,使用lettuce客户端
  8. 如何给mysql的海量数据查询优化
  9. MySQL慢查询日志:如何定位执行慢的sql语句
  10. assertEquals判断两个double是否相等的方法