我遇到的情况是从B类调用A类的方法。
class A(object):
def __init__(self, a):
self.a = a
def abc(self):
print self.a
class B(A):
def __init__(self):
super(B, self).abc()
def method1():
a = A(2)
method1()
b = B()
Expecting Output: 2
是否可以通过更改类A从类B调用方法'abc',并且不应该在类B中创建类A对象。如果是,那么请让我知道解决方案。
我尝试的上述程序给出了错误。
我得到的错误在
之下Traceback (most recent call last):
File "a.py", line 12, in <module>
b = B()
File "a.py", line 10, in __init__
super(B, self).abc()
File "a.py", line 6, in abc
print self.a
AttributeError: 'B' object has no attribute 'a'
答案 0 :(得分:2)
你的B类__init__方法没有接受任何参数,而A类的__init__要求你传递一个(名为“a”),但是你没有提供它。既不是你的B班,也不是把它传给A。
然而,这可行。
class B(A):
def __init__(self):
super(B, self).__init__(10)
inst = B()
inst.abc() # 10
或者:
icegram-popup
答案 1 :(得分:0)
下面:
class B(A):
def __init__(self):
super(B, self).abc()
永远不会调用A
的构造函数,因此缺少A.__init__
中的初始化。它在print self.a
中失败,因为没有a
。
应该调用超级构造函数。
此外,super(B, self).abc()
与self.abc()
相同。
如果在abc
中定义了名为B
的方法,那么self.abc()
将从B
调用该方法,而super(B, self).abc()
将调用该方法超类。
所以,既然那些是相同的,我就不会使用丑陋的那个。它只会降低代码的可读性。
有了这两个修正:
class B(A):
def __init__(self):
super(B, self).__init__(1000) # whatever default value
self.abc()