当我继承基类时为什么会出现'AttributeError'?

时间:2017-02-21 06:36:05

标签: python python-2.7 oop inheritance

对不起,我是oop的新手。

class A(object):
    def __init__(self, idn, name):
        self.idn = idn
        self.name = name


class B(object):
    def __init__(self, idn, acc_no, criminal_case='No'):
        self.idn = idn
        self.acc_no = acc_no
        self.criminal_case = criminal_case

    def get_info(self):
        return self.idn

class C(A, B):
    pass


c = C(1, 'xyz')
print c.get_info()
print c.criminal_case

追踪(最近一次呼叫最后一次):

文件“tp.py”,第25行,

print c.criminal_case

AttributeError:'C'对象没有属性'criminal_case'

2 个答案:

答案 0 :(得分:1)

Python不会为继承层次结构中的每个类调用__init__()。相反,它只是在层次结构中搜索第一个 __init__()并运行它。在代码中添加一些打印语句以便自己查看。

要从B.__init__调用A,您需要按照以下方式自行致电super()

super(A, self).__init__(idn, None)

但这没有多大意义:acc_no应该来自哪里?也许你应该重新审视你的班级设计。

答案 1 :(得分:1)

在没有genpkey的情况下使用多重继承几乎是不可能的,因此您需要使用super()

<强>超级()

  

返回将方法调用委托给父或者的代理对象   兄弟姐妹类型。这对于访问继承的方法很有用   在课堂上被覆盖的。

您的代码应该是这样的:

super()

你会得到输出:

   class A(object):
        def __init__(self, idn, name):
            super(A, self).__init__(idn, name,'test')
            self.idn = idn
            self.name = name

在Python 3.x中你可以使用1 test ,而你似乎正在使用Python 2.x,所以你需要使用super().__init__()

希望这有帮助。