一、概念:
在面向对象的世界中,子类从父类上继承父类,就可以直接拥有父类原有的属性和方法,这样可以减少代码的冗余,可实现复用的效果。子类也可以重新定义属于自己的属性和方法。
二、类的表达式:
子类可以继承父类
父类有的,子类继承后,都可以直接拿来使用
可以继承:非私有属性和非私有方法,可以理解为财产/资源/人脉
不可以继承:私有属性和私有方法,可以理解为媳妇/私房钱 是私有化的东西
class Father:
name = "小明" # 父类的属性
def hobby(self): # 父类的方法
print("打篮球")
class Son(Father):
def swim(self): # 子类的方法
print("游泳")
s = Son()
print(s.name) # 子类继承了父类的属性,输出为小明
s.hobby() # 子类继承了父类的hobby方法,输出为打篮球
s.swim() #子类自己的方法,输出为游泳
三、重写:
子类里新增的方法跟父类的方法名一样时,会代替父类的方法
子类里面的函数名与父类函数名重复的时候,优先调用子类的函数
class Father:
def hobby(self):
print("打篮球")
class Son(Father):
def hobby(self):
print("看电视")
s = Son()
s.hobby() # 子类重写了父类的hobby方法,输出为看电视
四、拓展:子类新增的函数(父类并没有的)
class Father:
def hobby(self):
print("打篮球")
class Son(Father):
def study(self):
print("学习")
s = Son()
s.study() # 子类继承了父类,拓展了study的方法,输出为学习
五、多继承:
继承多个父类 具有两个父类的属性和方法 如果两个父类具有同名方法的时候 就近原则
class Father_1:
def hobby(self):
print("打篮球")
class Father_2:
def study(self):
print("学习")
class Son(Father_1,Father_2):
pass
s = Son()
s.hobby() # 子类继承了Father_1的hobby方法,输出为打篮球
s.study() # 子类同时也继承了Father_2的study方法,输出为打篮球
六、超继承:
子类重写了父类的方法,但是子类还想用之前被重写之前父类的方法,就可以使用超继承。这是一种贪婪的继承。
class Father:
def hobby(self):
print("打篮球")
class Son(Father):
def hobby(self):
super(Son, self).hobby() # 超继承,能继承父类同名的方法
print("学习")
s = Son()
s.hobby() #输出为打篮球 学习
七、初始化函数(构建函数)
Python中的构造函数的表达式为__init__函数。在Python中,子类如果定义了构造函数,而没有调用父类的,那么Python不会自动调用,也就是说父类的构造函数不会执行。如果父类有构造函数的话,子类就不能重新定义属于他自己的构造函数。
class Father:
def __init__(self, name):
self.name = name
class Son(Father):
def call_name(self):
print(self.name)
s = Son("小明")
s.call_name() # 子类继承了父类的构造函数,输出为小明
八、类的私有属性和方法:
私有属性和方法是只提供类自己调用的,相当于内部可使用,对于子类和其他类都不能调用。
私有属性分为:
1 _属性/_方法 子类可以继承父类的浅度私有属性和方法,浅度私有是可被其他调用的
class Father:
_name = "小明" # 浅度私有name属性
class Son(Father):
pass
s = Son()
print(s._name) #输出为小明
2 __属性/__方法 子类不可以继承父类的深度私有属性和方法,深度私有是不可以被其他调用
class Father:
__name = "小明" # 深度私有name属性
class Son(Father):
pass
s = Son()
print(s.__name)
# 输出报错 AttributeError: 'Son' object has no attribute '__name'