zoukankan      html  css  js  c++  java
  • python中的私有变量

    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

  • 相关阅读:
    jmeter(46) redis
    jmeter(45) tcp/ip协议
    Codeforces Round #538 (Div. 2)D(区间DP,思维)
    Codeforces Global Round 1D(DP,思维)
    Educational Codeforces Round 57D(DP,思维)
    UPC11073(DP,思维)
    Yahoo Progamming Contest 2019D(DP,思维)
    Atcoder Beginner Contest 118D(DP,完全背包,贪心)
    Xuzhou Winter Camp 1C(模拟)
    Educational Codeforces Round 57 (Rated for Div. 2)D(动态规划)
  • 原文地址:https://www.cnblogs.com/saolv/p/9819820.html
Copyright © 2011-2022 走看看