在使用内部类时,我无法让我的小程序工作。 当我从外部类设置一个内部类成员变量时,该值不会粘滞。感谢。
这是我的源代码:
class Erik:
def __init__(self):
self.__myData = self.Data()
class Data:
def __init__(self):
self.__privateNumber = 0
def getNumber(self):
return self.__privateNumber
def getData(self):
return self.__myData
def fun(self):
self.__myData.__privateNumber = 64
print 'Private Number Inside:', self.__myData.__privateNumber
myErik = Erik()
print 'Having fun...'
myErik.fun()
# This print statement should output '64'
print 'Private Number Outside:', myErik.getData().getNumber()
这是我脚本的输出:
C:\Users\Erik\Desktop\PYTHON_TINKER_DEALS>python erik.py
Having fun...
Private Number Inside: 64
Private Number Outside: 0
如您所见,当我将私有号设置为64时,当您从外部类获取数据时,它不会反映出来。 感谢。
答案 0 :(得分:0)
变量名称以双下划线作为前缀,因此名称被修改(请参阅docs),因此您将从类的内部和外部引用不同的变量。
使其工作的一种方法是删除双下划线。创建变量名称
privateNumber
即使单个下划线在这里似乎也不合适,因为您打算从子类外部引用该变量。
如果你想保留__
,你只需为该值创建一个setter函数,并通过它设置它并通过getter读取它。
即
class Data:
# ....
def setNumber(self, num):
self.__privateNumber = num
答案 1 :(得分:0)
由于__
-induced name mangling,您在self.__myData.__privateNumber
中设置的Erik.fun
与Data.__init__
中初始化的变量不同。您可以通过将Erik.fun
中的两个引用更改为其错位形式来查看此内容:
def fun(self):
self.__myData._Data.__privateNumber = 64
print 'Private Number Inside:', self.__myData._Data__privateNumber
但是,一般情况下,如果您担心重写私有变量的子类,则只需要使用__
- 前缀名称。此外,Python中很少使用嵌套类;可以在Data
之外声明Erik
,除非您有充分的理由将其包含在Erik
中。最后,您应该始终明确地从object
继承,以避免创建旧式类。
class Erik(object):
答案 2 :(得分:0)
为什么要将所有变量设为私有?
Python对私人变量的态度是"我们这里的所有成年人都是#34;所以没有什么是私密的。做什么是mangle"私人"的名字。变量。如果您想访问self.__myData.__privateNumber
内的fun()
,则需要使用损坏的名称。即self._Erik__myData._Data__privateNumber
。如果您认为自己重新分配了价值,那么您真正在做的就是创造一个新的财产。