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,但是最好不要这样做。通常的方法是公开类的接口。