本套课在线学习视频(网盘地址,保存到网盘即可免费观看):
https://pan.quark.cn/s/493ae5f21f26
在面向对象编程中,继承是一个重要的概念,它允许子类继承父类的属性和方法,从而实现代码的重用和扩展。然而,在继承过程中,如果子类和父类具有相同名称的属性,Python会优先使用子类自身的该属性值。这一行为体现了Python中关于属性查找的多层次机制,即从当前类开始,逐级向上层继承类搜索直至找到该属性的定义。
00:00 - 面向对象单继承下属性查找与覆盖
属性查找机制
在Python中,当子类继承自父类时,属性查找遵循以下顺序:
- 首先在子类中查找该属性。
- 如果子类中没有该属性,则向上查找父类中的属性。
- 如果父类中也没有该属性,则继续向上查找,直到找到该属性或到达基类(通常为
object
)。
属性覆盖
子类可以通过定义与父类相同名称的属性来覆盖父类的属性。这样,当访问该属性时,Python会优先使用子类中的属性值。
class Parent:
def __init__(self):
self.name = "Parent"
class Child(Parent):
def __init__(self):
super().__init__()
self.name = "Child"
parent = Parent()
child = Child()
print(parent.name) # Output: Parent
print(child.name) # Output: Child
使用super
关键字
super
关键字用于调用父类的方法和访问其属性。通过super
,子类可以在保留父类行为的基础上,添加或修改特定的属性值。
class Parent:
def __init__(self):
self.name = "Parent"
class Child(Parent):
def __init__(self):
super().__init__()
self.name = "Child"
def display_name(self):
print(f"Child's name: {self.name}")
print(f"Parent's name: {super().name}")
child = Child()
child.display_name()
# Output:
# Child's name: Child
# Parent's name: Parent
01:57 - Python中的类继承与属性查找机制
继承层次结构
在Python中,类之间的继承关系形成了一个层次结构。当一个类继承另一个类时,它将获得其父类的所有属性和方法。
class Grandparent:
def __init__(self):
self.name = "Grandparent"
class Parent(Grandparent):
def __init__(self):
super().__init__()
self.name = "Parent"
class Child(Parent):
def __init__(self):
super().__init__()
self.name = "Child"
child = Child()
print(child.name) # Output: Child
属性查找顺序
如果子类和父类均拥有相同名称的属性,则优先使用子类自身的该属性值。若子类没有此属性,则继续向上层继承类查找,直至达到基类(通常为object
)。
class Grandparent:
def __init__(self):
self.name = "Grandparent"
class Parent(Grandparent):
def __init__(self):
super().__init__()
self.name = "Parent"
class Child(Parent):
def __init__(self):
super().__init__()
self.name = "Child"
child = Child()
print(child.name) # Output: Child
# Removing the name attribute from Child
del child.name
print(child.name) # Output: Parent
# Removing the name attribute from Parent
del child.name
print(child.name) # Output: Grandparent
总结
在Python面向对象编程中,单继承背景下的属性值查找遵循从当前类开始,逐级向上层继承类搜索的机制。子类可以通过定义与父类相同名称的属性来覆盖父类的属性,从而实现灵活的功能扩展和定制。使用super
关键字可以调用父类的方法和访问其属性,同时也能够有选择地覆盖部分属性,进一步增强了面向对象设计的灵活性和可维护性。