Python中的继承和初始化方法

132 投票
5 回答
183279 浏览
提问于 2025-04-16 12:49

我刚开始学Python,关于继承和__init__()我有点搞不懂。

class Num:
    def __init__(self,num):
        self.n1 = num

class Num2(Num):
    def show(self):
        print self.n1

mynumber = Num2(8)
mynumber.show()

结果:8

这个是没问题的。但是我把Num2替换成了

class Num2(Num):
    def __init__(self,num):
        self.n2 = num*2
    def show(self):
        print self.n1,self.n2

结果:错误。Num2没有属性"n1"。

在这种情况下,Num2怎么才能访问n1呢?

5 个回答

27

在Num2类中做一个简单的修改,像这样:

super().__init__(num) 

这样在python3中就能正常工作了。

class Num:
        def __init__(self,num):
                self.n1 = num

class Num2(Num):
        def __init__(self,num):
                super().__init__(num)
                self.n2 = num*2
        def show(self):
                print (self.n1,self.n2)

mynumber = Num2(8)
mynumber.show()
47

当你重写了初始化方法(init)的时候,也需要调用一下父类的初始化方法。

super(Num2, self).__init__(num)

理解Python中的super()和__init__()方法

194

在第一种情况下,Num2 是从 Num 这个类继承而来的,因为你没有在 Num2 中重新定义一个叫 __init__() 的特殊方法,所以它就自动继承了 Num 里的这个方法。

当一个类定义了 __init__() 方法时,每当你创建这个类的新实例时,__init__() 方法会自动被调用。

在第二种情况下,由于你在 Num2 中重新定义了 __init__(),如果你想要保留 Num 类中的一些功能,就需要明确地调用父类(Num)中的 __init__() 方法。

class Num2(Num):
    def __init__(self,num):
        Num.__init__(self,num)
        self.n2 = num*2

撰写回答