Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在包含的类之间共享变量_Python_Encapsulation - Fatal编程技术网

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

Python:在包含的类之间共享变量,python,encapsulation,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) re

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

比如说

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
如果name==main: b=基础`

__内部类是否有方法访问父类的成员

我正在寻找像parent.\u vars/\u方法这样的私有成员

为了更好地解释这一点,我编辑了代码。运行此代码会引发

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

必须使用BaseClassName.methodnameself、参数或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()

您可以在

找到一个非常有用的资源来访问privete方法,而不是:

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

基本对象是单例对象。顺便说一句,内部类引用了其父对象自身。\uu父对象。所以你可以用它来访问父类的成员。我专门寻找私有方法,所以基类之外的类不能调用,除了内部类,比如上面的_private_方法。python中没有私有变量或方法。您所拥有的是仅以双下划线显示为私有的内容。如果需要,您可以随时访问它。为了更好地格式化,我已将代码粘贴到pastebin中。如果您运行该代码,错误将显而易见。如果change_some_字段的基本版本更改为u change_some_字段,则无法从内部类调用此字段。from:“Private”Python中不存在除了从对象内部之外无法访问的实例变量…..任何形式的标识符至少有两个前导下划线,最多一个尾随下划线以文本形式替换为_classname u spam,其中classname是当前类名,前导下划线已去除。只要标识符出现在类的定义中,就可以在不考虑标识符的语法位置的情况下进行修改。顺便说一句,我仍然找不到如何从内部访问某些字段:谢谢你的参与!!!!我想知道是否还有其他方法来解决这个问题。基本上,我有一个将被其他客户机使用的类“Base”。我需要一个特殊的客户端“friend_类”来调用“Base”的内部函数。因此,我添加了一个内部类,并将“\u internal”引用传递给“friend”类。“internal”基本上充当存根代码和friend类使用基类的私有方法的门。如果需要添加类名,那么friend也可以实现同样的效果,在这种情况下不需要内部方法。您可以创建公共getter方法来处理私有数据,或者调用privet方法。这些方法是私有的,这是有原因的。Python并不真正使它们像C++一样私有,你仍然可以把它们称为Python中的U,但是最好不要这样做。通常的方法是公开类的接口。