面向对象的编程语言如果没有继承,类就没有意义。Python同样支持继承语法。
什么是父类和子类?
如果我们认为人类是一个父类,中国人就是一个子类;美国人是另一个子类。
如果我们认为中国人是一个父类,北京人就是一个子类;天津人是另一个子类。
如果我们认为外星人是一个父类,变形金刚就是一个子类;氪星人是另一个子类。
如果我们认为变形金刚是一个父类,汽车人就是一个子类;霸天虎是另一个子类。
如果我们认为超级英雄是一个父类,漫威英雄就是一个子类;DC英雄是另一个子类。
如果我们认为漫威英雄是一个父类,复仇者就是一个子类;自杀小队是另一个子类。
什么是继承?
与多态、封装共为面向对象的三个基本特征。 继承可以使得子类拥有父类的属性和方法;也可以重新定义、追加属性和方法。
首先我们创建一个父类
class Parent:
name: str
age: int
def print_message(self):
print("姓名:{} 年龄:{}".format(self.name, self.age))
然后创建一个子类继承这个类
# 通过()继承父类
class Child(Parent):
id: str
def print_id(self):
print("ID:{}".format(self.id))
则Child类实际拥有三个字段 name age id 和两个自定义方法 print_message 和 print_id
通过继承,子类可以获得父类的属性和方法,此时父类称为父类(Parent Class)或超类(Super Class),子类称为子类(Child Class 或 Sub Class)。另一方面,子类可以创建属于自己的属性和方法,在强调这一过程时,继承也称作派生,父类称为基类(Bass Class),子类称为派生类(Derived class)。
什么是重写
虽然子类可以继承父类的方法,但是父类的方法不一定适合子类使用。如果父类的方法不适合子类的使用,子类可以声明一个同名方法,将父类的方法覆盖,这个过程称为【重写】。
class Parent:
name: str
age: int
def print_message(self):
print("姓名:{} 年龄:{}".format(self.name, self.age))
# 通过()继承父类
class Child(Parent):
id: str
def print_id(self):
print("ID:{}".format(self.id))
# 子类重写父类的同名方法
def print_message(self):
print("姓名:{} 年龄:{} ID:{}".format(self.name,
self.age, self.id))
调用父类的同名方法
当父类的同名方法不适合子类,子类可以重写这个方法。但是往往父类的同名方法并非完全无用,能够为子类方法计算出正确的结果提供帮助。这时候,子类在重写父类方法的时候,可以通过super关键字调用父类同名方法,完成一部分运算,再增添子类独有的运算。
class Parent:
name: str
age: int
def print_message(self):
print("姓名:{}\n年龄:{}".format(self.name, self.age))
# 通过()继承父类
class Child(Parent):
id: str
# 子类重写父类的同名方法,通过super调用父类同名方法
def print_message(self):
# 首先打印继承自父类的两个字段信息
super().print_message()
# 再打印子类派生的字段的信息
print("ID:{}".format(self.id))
其他的重写?
class Parent:
def __init__(self, name, age):
self.__name = name
self.__age = age
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
def print_message(self):
print("姓名:{}\n年龄:{}".format(self.__name, self.__age))
@classmethod
def print_class_name(cls):
print("Parent")
@staticmethod
def print_class_type():
print("Parent")
# 通过()继承父类
class Child(Parent):
# 重写init方法
def __init__(self, name, age, id_):
super().__init__(name, age)
self.__id = id_
# 属性的重写
@property
def name(self):
return self.__name[2: -3]
@name.setter
def name(self, value):
self.__name = "[{}]".format(value)
# 子类重写父类的同名方法,通过super调用父类同名方法
def print_message(self):
super().print_message()
print("ID:{}".format(self.__id))
# 类方法的重写
@classmethod
def print_class_name(cls):
print("Parent")
# 静态方法的重写
@staticmethod
def print_class_type():
print("Parent")