python中使用锁和使用变量的区别 python 变量加锁_pycharm



这里写目录标题

  • 一、Python 私有变量的访问和赋值
  • 二、变量前加(_)
  • 三、其他


一、Python 私有变量的访问和赋值

python中的私有变量是以双下划线开头的变量,例如__name。虽然不能直接从外部访问私有变量,但是可以通过一些方式来访问。

一种方式是通过使用变量名改写规则来访问私有变量。Python解释器会将双下划线开头的变量名改写为_类名__变量名的形式。例如,对于类Person中的私有变量__name,可以通过_Person__name来访问。
另一种方式是通过提供公有的getter和setter方法来访问和修改私有变量。通过这种方式,可以在方法内部对私有变量进行操作,同时对外部隐藏实际的变量名。
然而,尽管可以通过上述方式访问私有变量,但是强烈建议不要这样做。因为不同版本的Python解释器可能会将私有变量名改写成不同的形式,这样会导致代码的可移植性和可维护性变差。

案例

class S:
    __name = 'kobe'
    _age = 18

    def __init__(self):
        self.__name1 = 'zhil'
        self.__age1 = 20
        self.__sex='女'

    def get_name(self):
        return self.__name1

    def get_age(self):
        return self.__name1

    def set_age(self, sex):
        self.__sex = sex
s = S()  
# print(s.__name)     #AttributeError: 'S' object has no attribute '__name'
# print(s.__name1)    #AttributeError: 'S' object has no attribute '__name'
print(s._age)  # 18
# print(s.__name1)
print(s.get_name())  # zhil

我们知道,私有变量是不能直接通过:s.__name直接访问滴。而是必须在类内部通过方法返回私有变量。

那么双下划线开头的实例变量是不是一定不能从外部访问呢?也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Person__name,
所以,我们仍然可以通过 _person__name 来访问__name变量(注意这里的下划线)

print(s._S__name1)  # zhil

但是我强烈建议大家不要这么做,因为不同版本的Python解释器可能会把__name改成不同的变量名

注意下面的这种错误写法:

s.__sex='男'  #设置__sex属性
print(s.__sex)  	#男
print(s._S__sex)    #女

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

二、变量前加(_)

私有化属性和方法,类对象和子类可以访问。表面上私有,实际可被外部调用,是一种潜在规则

但为了编程的需要,我们常常需要区分私有方法和共有方法以方便管理和调用。那么在Python中如何做呢?

但为了编程的需要,我们常常需要区分私有方法和共有方法以方便管理和调用。那么在Python中如何做呢?
一般Python约定加了下划线 _ 的属性和方法为私有方法或属性,以提示该属性和方法不应在外部调用,也不会被from ModuleA import *导入。如果真的调用了也不会出错,但不符合规范。

下面的代码演示加了_ 的方法,以及在类外面对其的可访问性。

class Solution:
    def _func(self):
        print('I am a private function.')

    def func(self):
        return self._func()


s = Solution()
s.func()            # I am a private function.
s._func()           # I am a private function.

三、其他

xx:公有变量,所有对象都可以访问;
__xx__:双前后下划线,用于定义类的魔术属性/模法方法,例如: __init__,__str__等,无法直接调用;
xx_:单后置下划线,用于避免与python关键字的冲突。