继承的概念
在现实生活中,继承一般指的是子女继承父辈的财产。那么在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中可以描述为猫和狗都继承自动物。同理,波斯猫和家猫都继承自猫。而斑点狗,泰迪都继承之狗。程序中当我们定义一个class的时候,可以从某个现有的class继承,新的class称之为子类(Subclass),而被继承的class称之为基类、父类或超类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
单继承
class DerivedClassName(BaseClassName): # 可以继承多个基类,从左到右开始
<statement-1>
.
<statement-N>
需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,
Python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。
#类定义
class People:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print(f"{self.name}说,你今年{self.age}岁了,体重是{self.__weight}")
#单继承示例
class Student(People): # 继承People类
grade = ''
def __init__(self,n,a,w,g):
people.__init__(self,n,a,w) # 调用父类方法
# super(Student,self).__init__(n,a,w) # 也可以这么调用父类
# super().__init__(n,a,w) # 也可以这么调用父类
self.grade = g # 比父类多了一个变量
print(f"我上{self.grade}年级了", end=",")
stu = Student("张三", 10, 120, 20)
stu.speak() # 我上20年级了,张三说,你今年10岁了,体重是120
如果在子类中写和父类一样的函数,调用的时候调用的是子类还是父类呢?
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class Student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print(f"{self.name}说: 我 {self.age} 岁。我的年级是{self.grade}" )
p = Student("zhangsan", 20, 150, 10)
p.speak() # zhangsan说: 我 20 岁。我的年级是10
从上面的代码不难看出,调用的是子类的函数,也就是相当于将父类的方法进行重写
多重继承
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
<statement-N>
class A (object):
grade = 100
def __init__(self):
self.grade = 20
print(f"得分为{self.grade}")
class B (object):
name = "张三"
def __init__(self):
self.name = "张三"
print(f"他的名字叫{self.name}")
class C (A,B):
def __init__(self):
A.__init__(self)
B.__init__(self)
print(f"{self.name}得了{self.grade}")
c = C()
"""
得分为20
他的名字叫张三
张三得了20
"""
继承理论上就是减少代码量哦
方法重写
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法,使用super时,括号内使用的参数是本类