Python:在包含的类之间共享变量

时间:2015-03-26 04:04:03

标签: python encapsulation

有没有办法在类和嵌套类之间共享成员变量?

例如

class Base(object):
  class __Internal(object):
    def __init__(self, parent):
        self.__parent = parent
        self.__parent.__private_method()


#
def __init__(self):
    self.__internal = Base.__Internal(self)
    return

def __private_method(self):
    print "hurray"
    return

如果名称 ==“主要”:     b = Base()`

有没有办法让__Internal类访问父类的成员?

我正在寻找像父.__ vars / __方法这样的私人会员。

我已编辑代码以更好地解释这一点。运行此代码抛出

AttributeError: 'Base' object has no attribute '_Internal__private_method'

2 个答案:

答案 0 :(得分:0)

您必须使用BaseClassName.methodname(self,arguments)或BaseClassName.field

示例(非常难看的代码):

class Base(object):
    some_field = "OK"

    class Internal(object):
        def __init__(self, parent):
            self.__parent = parent

        def change_some_field(self):
            Base.some_field = "NOP"

    def __init__(self):
        self.__private = "val"
        self.__internal = Base.Internal(self)

    def show_field(self):
        print self.some_field

    def change_some_field(self):
        self.__internal.change_some_field()


def main():
    a = Base()
    a.show_field()
    a.change_some_field()
    a.show_field()
    return 0

if __name__ == '__main__':
    main()

您可以在Why are Python's 'private' methods not actually private?

找到非常有用的资源

答案 1 :(得分:0)

要访问私有方法,而不是:

self.__parent.__private_method()

使用它:

self.__parent._Base__private_method()

修改了你的例子:

class Base(object):
        class __Internal(object):
                def __init__(self, parent):
                        self.__parent = parent
                        self.__parent._Base__private_method()


        def __init__(self):
                self.__internal = Base.__Internal(self)
                return

        def __private_method(self):
                print "hurray"
                return


if __name__ == "__main__":
        b = Base()

结果是:

hurray