Python 私有变量没有错误
No error for Python private variable
我在使用 python 时遇到了一个奇怪的问题。考虑以下代码:
class Foo:
__bar=None
foo=Foo()
foo.bar=10
print(foo.bar)
我想我应该在这里得到一个错误。但是我得到的输出是 10。即使我将代码更改为:
,我也会得到相同的输出
foo=Foo()
foo.__bar=10
print(foo.__bar)
有人可以解释为什么我在这里没有收到错误消息吗?另外我应该怎么做才能得到错误?
编辑以进一步说明:
class Foo:
def __init__(self):
self.__bar=10
def get_bar(self):
return self.__bar
foo=Foo()
foo.__bar=20
print(foo.__bar)
print(foo.get_bar())
谁能解释一下为什么我得到的答案是 20 和 10?我以为我会在尝试访问 class 之外的私有实例变量时出错。感谢您的帮助。
首先,您应该阅读相关问题的答案。
其次,不要混淆 class-成员和实例成员。您对 class Foo
的定义包括一个名为 __bar
的 class 成员,但分配给 foo.__bar
会添加一个 实例成员 掩盖了它(而不是覆盖它)。这些是不同的东西。
现在,当您从 "outside" 分配(或通常访问)前导双下划线属性时(在您的示例中,使用 foo.__bar
),名称不会被破坏,一切都没有额外的魔法。但是,访问前导双下划线属性的标准方法是从 class 的方法内部(使用 self.__bar
),这就是魔法发生的时候。
演示:
class Foo(object): pass
f = Foo()
foo.__bar = 10
foo.__bar
=> 10
foo.__dict__.keys()
=> dict_keys(['__bar'])
class Foo(object):
def __init__(self):
self.__bar = 10
foo = Foo()
foo.__dict__.keys()
=> dict_keys(['_Foo__bar']) # mangaled!
foo.__bar # cannot access from "outside"
=> AttributeError
我在使用 python 时遇到了一个奇怪的问题。考虑以下代码:
class Foo:
__bar=None
foo=Foo()
foo.bar=10
print(foo.bar)
我想我应该在这里得到一个错误。但是我得到的输出是 10。即使我将代码更改为:
,我也会得到相同的输出foo=Foo()
foo.__bar=10
print(foo.__bar)
有人可以解释为什么我在这里没有收到错误消息吗?另外我应该怎么做才能得到错误? 编辑以进一步说明:
class Foo:
def __init__(self):
self.__bar=10
def get_bar(self):
return self.__bar
foo=Foo()
foo.__bar=20
print(foo.__bar)
print(foo.get_bar())
谁能解释一下为什么我得到的答案是 20 和 10?我以为我会在尝试访问 class 之外的私有实例变量时出错。感谢您的帮助。
首先,您应该阅读相关问题的答案。
其次,不要混淆 class-成员和实例成员。您对 class Foo
的定义包括一个名为 __bar
的 class 成员,但分配给 foo.__bar
会添加一个 实例成员 掩盖了它(而不是覆盖它)。这些是不同的东西。
现在,当您从 "outside" 分配(或通常访问)前导双下划线属性时(在您的示例中,使用 foo.__bar
),名称不会被破坏,一切都没有额外的魔法。但是,访问前导双下划线属性的标准方法是从 class 的方法内部(使用 self.__bar
),这就是魔法发生的时候。
演示:
class Foo(object): pass
f = Foo()
foo.__bar = 10
foo.__bar
=> 10
foo.__dict__.keys()
=> dict_keys(['__bar'])
class Foo(object):
def __init__(self):
self.__bar = 10
foo = Foo()
foo.__dict__.keys()
=> dict_keys(['_Foo__bar']) # mangaled!
foo.__bar # cannot access from "outside"
=> AttributeError