一、先看个简单的例子
class A:
def __init__(self,name):
self.name = name
def haha(self):
print("方法a")
class B(A):
pass
b = B()
以上代码,B继承了A,B中没有定义任何属性,但是当直接实例化B时,执行此文件,会提示:
Traceback (most recent call last):
File "test01.py", line 10, in <module>
b = B()
TypeError: __init__() missing 1 required positional argument: 'name'
以上提示少’name’这个参数,因为B继承了A,所以name这个属性,B也是具有的,其中B也具有haha这个方法。那么正确的实例化应该是:
b = B("yxi")
二、进阶
对以上例子进行稍微的修改,给B中也添加__init__初始化方法,并赋予age属性
class A:
def __init__(self,name):
self.name = name
print("name:",self.name)
def a(self):
print("方法a")
class B(A):
def __init__(self,age):
self.age = age
print(self.age)
b = B(23)
以上代码输出结果为23,跟name属性没有任何关系,并且不具有name这个属性了,因为子类的__init__方法会将父类的初始化方法覆盖。那么问题来了,我不想覆盖父类的属性,父类的属性我还要用,怎么做呢?看下面写法:
class A:
def __init__(self,name):
self.name = name
print("name:",self.name)
def a(self):
print("方法a")
class B(A):
def __init__(self,name,age):
self.age = age
super().__init__(name)
print(self.name,self.age)
b = B("yxi",22)
输出:
name: yxi
yxi 22
其中可以看出,在B中的__init__方法中,多传入一个name参数,并且这个name就是通过super().init(name)引入了父类的name属性。或者通过A.init(self,name)的方式传入也可以。(前面的两个init,应该含有双下划线,不知道这里怎么调,写法以代码块中为准,,哈哈哈)