class Test1:
    def f1(self):
        self.name ="张三"
        self.__age = 20 #使用名称变形实现私有变量
        print(self.name)
        print(self.__age)
 
class Test2(Test1): #继承基类Test1
    def f(self):
        print(self.name)
        print(self.__age)
 
inst1 = Test1()
inst1.f1()
 
Test2.f(inst1)
\'\'\'--------------------- 
作者:Mr.杨. 
来源:CSDN 
原文:https://blog.csdn.net/kc_1197977022/article/details/70664676?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!
\'\'\'
#输出如下:
\'\'\'
张三
20
张三
AttributeError: \'Test1\' object has no attribute \'_Test2__age\'
\'\'\'

在python中,类中定义的__spam(至少两个前导”_”,最多一个后缀”_”)会被文本式的替换为_classname__spam(classname是当前类名),无论这个变量是实例变量还是类变量。而这个过程可以理解为发生在执行代码之前

__age会被文本式的转换为_classname__age,而这里的classname是当前类,所以test1中的__age会被文本式的替换为_Test1__age,test2中的__age会被替换为_Test2__age。

 

注意:仅仅在类中出现的__spam会被替换,而在类外部出现的__spam则不会被替换:

 

就是说类内部使用私有变量,会自动带上类名

所有的私有变量都不应该在外部使用,虽然我们可以这样使用_类名+私有变量这样在外部使用,但是这违背了我们的初中,所以所有的私有变量都不该在外部使用

 

在java中,类中的变量有三种,public,protect,private,那么从这个角度将,python只有两种 public和privata,而前面两个下滑下就是后者,不加就是前者

——————————————————分割线++++++++++++++++++++++++++++++

 

以上说的是前面有两个下划线,后面有至多一个下划线的成员变量,这种变量就是本文章主要讨论的私有变量,

还有一种变量,前面只有一个下划线,无后缀下划线,这种变量也是有特殊意义的,这种变量是

叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;这个现在暂且不熟悉,等以后用到了再来更新

 

更新:

目前已知的_spam的作用:比如在模块c.py中定义了一个前面有一个下划线的变量,_c,然后在主程序中导入该模块所有 ,from c import *

,则主程序不能访问到这个_c变量

需要注意的是,如果是前置两个下划线的变量,__c,则通过from module_name import *的方式也同样无法访问到这个变量

 

第二次更新:

一个前置下滑线的变量_c虽然不能通过from module_name import * 这样的方式在当前程序中引用,但是可以显式的直接导入: from module_name import _c

版权声明:本文为saolv原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/saolv/p/9819820.html