内心课有问题

时间:2017-03-01 02:50:55

标签: python class

在使用内部类时,我无法让我的小程序工作。 当我从外部类设置一个内部类成员变量时,该值不会粘滞。感谢。

这是我的源代码:

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时,当您从外部类获取数据时,它不会反映出来。 感谢。

3 个答案:

答案 0 :(得分:0)

变量名称以双下划线作为前缀,因此名称被修改(请参阅docs),因此您将从类的内部和外部引用不同的变量。

使其工作的一种方法是删除双下划线。创建变量名称

privateNumber

即使单个下划线在这里似乎也不合适,因为您打算从子类外部引用该变量。

如果你想保留__,你只需为该值创建一个setter函数,并通过它设置它并通过getter读取它。

class Data:
    # ....
    def setNumber(self, num):
        self.__privateNumber = num

答案 1 :(得分:0)

由于__-induced name mangling,您在self.__myData.__privateNumber中设置的Erik.funData.__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。如果您认为自己重新分配了价值,那么您真正在做的就是创造一个新的财产。