python变量——单下划线和双下划线
一、变量的定义
在Python中,有以下几种方式来定义变量:
- xx:公有变量
- _xx:前置单下划线,私有化属性或方法,一般来讲,变量名_xx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xx 来表示变量是很好的习惯。类对象和子类可以访问,这并不能完全做到真正的私有,只是约定俗成的而已,这样写表示不希望这个变量在外部被直接调用
- __xx:前置双下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到,只能是允许这个类本身进行访问了。连子类也不可以)
- __xx__:前后双下划线,系统定义名字(这就是在python中强大的魔法方法),因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
- xx_:后置单下划线,用于避免与Python关键词的冲突
如以下例子所示,我在test类中定义了x,_x和 __x三个属性,并创建了test的类对象t,对这三个属性进行访问,__x不能被访问到
class test(object):
def __init__(self):
self.x = 10
self._x = 20
self.__x = 30
t = test()
print(t.x) # 10
print(t._x) # 20
# print(t.__x) # AttributeError: 'test' object has no attribute '__x'
可以使用命令dir查看t中的属性和方法,__x的名字已经被重整为“_test__x”了,如果你非要通过外部访问,也是可以的,可以使用t._test__x对__x进行访问。
python中没有真正的公有和私有变量,python只是对变量名称做了一个变化,还是可以在外部访问到的,是伪私有。
注:虽然私有变量可以通过_类名__变量名来访问,但强烈建议不要这样做!
二、使用不同方法导入模块,模块中私有变量的使用区别
在使用不同方法导入模块后,是否能使用模块中的私有属性和方法,有以下两种情况
- 使用 from somemodule import * 进行导入,不能导入私有变量,结果如下:
- 在使用 import somemodule 导入模块的情况下,能导入并使用私有属性和方法
三、对类中的私有属性进行操作的方法
如果你想对类中的私有属性进行操作时,有以下两种方法种方法:
1,自定义一个方法
class test(object):
def __init__(self):
self.__x = 10
def get_x(self):
return self.__x
def set_x(self, value):
self.__x = value
t = test()
print(t.get_x()) # 10
t.set_x(30)
print(t.get_x()) # 30
2,就是使用property
class test(object):
def __init__(self):
self._x = 10
def get_x(self):
return self._x
def set_x(self, value):
self._x = value
x=property(get_x,set_x)
#或者通过装饰器的方式
class test(object):
def __init__(self):
self._x = 10
@property
def get_x(self):
return self._x
@x.setter
def set_x(self, value):