据我所知,面向对象编程中,子类会继承父类的所有属性。但在Python中,子类不会继承其父类的属性,除非它调用了父类的init方法,如下所示:
super().init()
。
我想知道我的推断是否正确?为什么会这样呢?我猜在其他语言如Java中,子类自动继承父类的所有属性,无需执行这样的操作。
提前感谢您的回答。
super().__init__()
时,你实际上是执行了父类的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):
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)
class Foo: pass; foo = Foo(); foo.a = 'bar'
,然后class Baz(Foo): pass
,那么Baz()
应该有一个a
属性吗? - juanpa.arrivillaga