我有以下代码。
class Foo(object):
def __init__(self):
self.__baz = 40
def foo(self):
print self.__baz
class Bar(Foo):
def __init__(self):
#super(Bar, self).__init__()
self.__baz = 21
def bar(self):
print self.__baz
x = Bar()
x.foo()
x.bar()
我收到此错误:
Traceback (most recent call last):
File "classes.py", line 15, in <module>
x.foo()
File "classes.py", line 5, in foo
print self.__baz
AttributeError: 'Bar' object has no attribute '_Foo__baz'
为什么foo
方法不继承Bar
。
编辑:如果您调用已注释掉的super,它会很好地工作。
双下划线属性的名称根据当前/包含的命名空间进行修饰。在函数中foo
,当前名称空间是Foo
这样,当python查找时self.__baz
,self._Foo__baz
由于名称修改方案,它实际上将在查找。由于Foo
您实际上没有设置__baz
属性,因此该类没有_Foo__baz
属性(_Bar__baz
因为您self.__baz
在中的方法中进行了设置,所以它具有属性Bar
)。
当然,你可能已经注意到,如果你调用Foo.__init__(self)
在Baz.__init__
(直接或通过super
),你会看到问题消失,因为Foo.__init__
套__baz
(即_Foo__baz
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句