覆盖__init__时属性不可用?

时间:2009-04-20 07:29:00

标签: python

我正在尝试覆盖__init__方法,但是当我调用super方法时,在该方法中创建的属性不可用。 我可以看到它不是继承问题,因为class B仍然具有可用的属性。

我认为代码示例会更好地解释它: - )

Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...   def __init__(self, *args, **kwargs):
...     self.args = args
...     self.kwargs = kwargs
... 
>>> a = A('a', 'b', key='value')
>>> print a.args, a.kwargs
('a', 'b') {'key': 'value'}
>>> class B(A):
...   pass
... 
>>> b = B('b', 'c', key_b='value_b')
>>> print b.args, b.kwargs
('b', 'c') {'key_b': 'value_b'}
>>> class C(A):
...   def __init__(self, *args, **kwargs):
...     print 'class C'
...     super(A, self).__init__(*args, **kwargs)
... 
>>> c = C('c', 'd', key_c='value_C')
class C
>>> print c.args, c.kwargs
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'C' object has no attribute 'args'
>>> class D(A):
...   def __init__(self, *args, **kwargs):
...     super(A, self).__init__(*args, **kwargs)
...     print 'D'
... 
>>> d = D('d', 'e', key_d='value D')
D
>>> print d.args, d.kwargs
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'D' object has no attribute 'args'
>>> 

2 个答案:

答案 0 :(得分:5)

您对超类的调用需要使用自己的类型

super(D, self).__init__(*args,**kwargs)

而不是

super(A...

我相信致电super(A, self).__init__会调用A的超类,即object。相反,您想要调用D的超类,即A

答案 1 :(得分:3)

你错误地使用了super()。在你的“C”类中, init ()方法的第二行应该将C作为第一个参数传递,如此...

super(C, self).__init__(*args, **kwargs)

实际上你甚至不需要在这里使用超级。你可以打电话

A.__init__(self, *args, **kwargs)
相关问题