Python中子类如何继承父类的属性

3
据我所知,面向对象编程中,子类会继承父类的所有属性。但在Python中,子类不会继承其父类的属性,除非它调用了父类的init方法,如下所示: super().init() 。 我想知道我的推断是否正确?为什么会这样呢?我猜在其他语言如Java中,子类自动继承父类的所有属性,无需执行这样的操作。 提前感谢您的回答。

这个回答解决了你的问题吗?理解Python中带有__init__()方法的super()。基本上,重点是确保调用方法解析顺序(MRO)中的下一个方法。 - Aditya
1
Python中的子类确实继承了父类的类属性。但是在Python中,实例属性始终属于特定实例,因此继承它们是没有意义的。例如,class Foo: pass; foo = Foo(); foo.a = 'bar',然后 class Baz(Foo): pass,那么Baz()应该有一个a属性吗? - juanpa.arrivillaga
1个回答

4
当你在子类中调用super().__init__()时,你实际上是执行了父类的init方法和方法内的所有内容。
子类将继承属性和所有方法,而不调用super().__init__()函数。但是,如果你在子类中定义了一个init函数,则它将覆盖子类中复制的父类的init方法。你必须记住,当子类继承父类时,它实际上创建了一个完全重复父类的子类,可添加和/或更改而不影响父类。你可以通过不覆盖它们来选择从父类继承哪些内容,并通过覆盖它们来选择不想继承的内容。
示例1
class parentclass:
        b = 31

        def __init__(self):
                self.a = 21
        def add(self, a, b):
                c = a+b
                print(c)


class childclass(parentclass):
        pass

child1 = childclass()

child1.add(10,20)
print(child1.b)
print(child1.a)

输出:

30
31
21

示例2:


class parentclass:
        b = 31

        def __init__(self):
                self.a = 21
        def add(self, a, b):
                c = a+b
                print(c)


class childclass(parentclass):
        def __init__(self):
                self.name="child"

child1 = childclass()

child1.add(10,20)
print(child1.b)
print(child1.a)

输出:

Traceback (most recent call last):
  File "C:/Users/chees/PycharmProjects/untitled/idk.py", line 20, in <module>
    print(child1.a)
AttributeError: 'childclass' object has no attribute 'a'
30
31

编辑:

这就是为什么子类的init方法中需要使用super().init()方法,以便在子类的init方法中再次复制父类的init方法,例如:


class parentclass:
        b = 31

        def __init__(self):
                self.a = 21
        def add(self, a, b):
                c = a+b
                print(c)


class childclass(parentclass):


        def __init__(self):
                super().__init__()
                self.name="child"

child1 = childclass()

child1.add(10,20)
print(child1.b)
print(child1.a)

是相同的意思

class parentclass:
        b = 31

        def __init__(self):
                self.a = 21
        def add(self, a, b):
                c = a+b
                print(c)


class childclass(parentclass):


        def __init__(self):
                self.a = 21
                self.name="child"

child1 = childclass()

child1.add(10,20)
print(child1.b)
print(child1.a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接