python中的私有变量

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): #继承基类Test1
    def 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 = 3
        print(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 --->最少两个前导和最多一个尾随下划线


图片较大,右键新窗查看


  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python私有变量是指在类以双下划线“__”开头的变量,这些变量只能在类内部访问,外部无法直接访问。私有变量的作用是保护数据,防止外部对数据的直接修改,从而提高程序的安全性和稳定性。 在Python私有变量的访问需要通过特殊的方式进行,即使用“_类名__变量名”的方式进行访问。例如,如果一个类定义了一个私有变量“__name”,那么在类内部可以直接访问该变量,但在类外部则需要使用“_类名__name”的方式进行访问。 下面是一个示例代码,演示了Python私有变量的定义和访问: class Person: def __init__(self, name, age): self.__name = name self.__age = age def get_name(self): return self.__name def get_age(self): return self.__age p = Person("Tom", 18) print(p.get_name()) # 输出:Tom print(p.get_age()) # 输出:18 print(p.__name) # 报错:'Person' object has no attribute '__name' print(p._Person__name) # 输出:Tom 在上面的代码,Person类定义了两个私有变量“__name”和“__age”,并提供了两个公共方法“get_name”和“get_age”用于获取这两个变量的值。在类外部,无法直接访问私有变量“__name”和“__age”,需要通过公共方法进行访问。同时,如果在类外部使用“__name”和“__age”进行访问,会导致程序报错。而使用“_Person__name”和“_Person__age”进行访问,则可以成功获取私有变量的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值