2017-02-21 103 views
-1

对不起,我是oop的新手。当我继承基类时,为什么会出现'AttributeError'?

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行,在

打印c.criminal_case

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

+0

你需要调用'super'。但是你的继承结构没有多大意义。你在哪里期望'B .__ init__'获得它的参数?你只能将两个传给'C'。第二个应该是'name'还是'acc_no'? – BrenBarn

+0

好吧!但我如何在C中调用B的init? –

回答

1

没有super()几乎不可能使用多重继承,所以你需要的是使用super()

超()

Return a proxy object that delegates method calls to a parent or sibling class of type. This is useful for accessing inherited methods that have been overridden in a class.

您的代码应该是这样的:

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

,你会得到输出:

1 
test 

在Python 3.x的你可以只使用super().__init__(),而且你似乎在使用Python 2.x,所以你需要使用super(A, self).__init__(idn, name)

希望这会有所帮助。

+0

谢谢,但我如何访问B的属性'criminal_case'? –

+0

@AmitKarnik'super(A,self).__ init __(idn,name,'this是criminal_case')',你会得到输出。 – McGrady

+0

谢谢@McGrady –

1

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

要从A调用B.__init__,您需要自行拨打super()

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

但是,这并不让有很大的意义:这里是为acc_no的价值从何而来?也许你应该重新审视你的课堂设计。

相关问题