在上一讲讲解了python3的类的基本定义,包括一些重要的区别。
这节我们讲解的是python3 强大的继承
有同学就要问了,继承是什么,为了做什么?带着这些疑问,我们来进行解答
继承在生活中的意思就是,继承财产,继承啥啥啥的。有点扯远了。。。
在python中,可以存在一个父类,许多个子类,如果子类继承父类,那么有什么特性呢。
首先,父类的方法,子类能访问,也就是说,父类的特性,能在子类中体现,这也是继承的特点。
下面通过代码来解释,这样会更加好理解
class Parent:
def __init__(self,hight=165,weight=125):
self.hight=hight
self.weight=weight
def print_information(self):
print("Parent is weight: %d, Parent is hight %d"%(self.weight,self.hight))
class Child(Parent):
pass
c=Child()
c.print_information()
我们首先定义一个父亲类,在定义一个孩子类,孩子类继承了父亲类,写法就是在孩子类后面加个父亲类即可
我们神奇的发现,孩子类的实例,既然能访问父亲的方法。说明产生了继承关系。
在上面代码中,父亲类中有一个init的构造函数,如果子类也存在一个构造函数,由于名字一样,那么子类的会覆盖父类的,所以父类init中的变量会访问不到,那么我们怎么解决问题呢
看下面代码
class Parent:
def __init__(self,hight=165,weight=125):
self.hight=hight
self.weight=weight
def print_information(self):
print("Parent is weight: %d, Parent is hight %d"%(self.weight,self.hight))
class Child(Parent):
def __init__(self,hight2=150,weight2=100):
self.hight2=hight2
self.weight2=weight2
c=Child()
print(c.hight)
运行上面代码,会报错
Traceback (most recent call last):
File “D:/Users/asus/PycharmProjects/untitled9/main.py”, line 17, in
print(c.hight)
AttributeError: ‘Child’ object has no attribute ‘hight’
Process finished with exit code 1
原因是,init被覆盖,无法访问父类的hight。
此时,就要引入 super() 了
class Parent:
def __init__(self,hight=165,weight=125):
self.hight=hight
self.weight=weight
def print_information(self):
print("Parent is weight: %d, Parent is hight %d"%(self.weight,self.hight))
class Child(Parent):
def __init__(self,hight2=150,weight2=100):
super().__init__()
self.hight2=hight2
self.weight2=weight2
c=Child()
print(c.hight)
加了一句 super().init() ,我们成功执行了代码,并且获取了hight值
OK
python3还支持多继承,但是多继承关系复杂,建议能不用就不要用。
多继承的语法 class A(B1,B2,B3) 就是在单继承后面加几个类名就好了。
下面在说几个注意点
类属性和类对象是相互绑定的
不会随着类对象改变而改变
属性和方法相同,属性会覆盖
这节就讲到这,有什么不足的请各位大佬指出,我一定火速改正!!!