在Python中,有以下几种方式来定义变量:
如以下例子所示,我在test类中定义了num,_num 和 __num三个属性,并创建了test的类对象t,对这三个属性进行访问,__num不能被访问到
class test(object):def __init__(self):self.num = 10self._num = 20self.__num = 30t = test()
print(t.num) # 10
print(t._num) # 20
# print(t.__num) # AttributeError: 'test' object has no attribute
'__num'
可以使用命令dir查看t中的属性和方法,__num的名字已经被重整为“_test__num”了,可以使用t._test__num对__num进行访问
注:虽然私有变量可以通过_类名__变量名来访问,但强烈建议不要这样做
在使用不同方法导入模块后,是否能使用模块中的私有属性和方法,有以下两种情况
首先我们先创建一个test.py文件,将下面代码复制进去:
num = 10
_num = 20
__num = 30def test():print("--test--")def _test2():print("--test2--")def __test3():print("---test3--")
In [1]: from test import *In [2]: num
Out[2]: 10In [3]: _num
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in ()
----> 1 _numNameError: name '_num' is not definedIn [4]: __num
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in ()
----> 1 __numNameError: name '__num' is not definedIn [5]: test()
--test--In [6]: _test2()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in ()
----> 1 _test2()NameError: name '_test2' is not definedIn [7]: __test3()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
in ()
----> 1 __test3()NameError: name '__test3' is not defined
In [8]: import testIn [9]: test.num
Out[9]: 10In [10]: test._num
Out[10]: 20In [11]: test.__num
Out[11]: 30In [12]: test.test()
--test--In [13]: test._test2()
--test2--In [14]: test.__test3()
---test3--
如果你想对类中的私有属性进行操作时,有以下三种方法:
添加getter和setter方法,类对象通过调用这两种方法来对私有属性进行操作
class test(object):def __init__(self):self.__num = 10def getNum(self):return self.__numdef setNum(self, value):self.__num = valuet = test()
print(t.getNum()) # 10
t.setNum(20)
print(t.getNum()) # 20
class test(object):def __init__(self):self.__num = 10def getNum(self):return self.__numdef setNum(self, value):self.__num = valuenum = property(getNum,setNum)t = test()
print(t.num) # 10
t.num = 20
print(t.num) # 20
关于property方法,我们来看下官方文档:

由文档可得:
class test(object):def __init__(self):self.__num = 10@propertydef num(self):return self.__num@num.setterdef num(self, value):self.__num = valuet = test()
print(t.num) # 10
t.num = 20
print(t.num) # 20
关于@property,官方文档如下:

根据文档可得: