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关键字的冲突。