如何在python中实现以下程序

时间:2016-10-02 17:54:17

标签: python python-2.7

我遇到的情况是从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'

2 个答案:

答案 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()