一、继承(Inheritance)
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。子类可以重用父类的代码,并且可以添加新的属性和方法,或者重写父类的方法。
1.继承的基本格式
class 子类名(父类名)
class 子类名(父类名1,父类名2...)
对于同名的属性和方法,在子类中定义的优先级大于在父类中定义的优先级。
2.__init__()方法
对于在子类中执行父类的init方法,我们可以使用一种笨拙的方法,直接使用在类外调用类方法:
class Father():
def __init__(self,age):
self.name = "父亲"
self.age = age
class Son(Father):
def __init__(self,age):
Father.__init__(self,age)
def speking(self):
print(f"我的名字是:{self.name},年龄是{self.age}")
person = Son("250")
person.speking()
3.super()方法
super()方法会使子类从其父类中继承所有方法和属性:
通过使用super()方法您不必使用在类外调用父类的方法,它将自动从其父类继承方法和属性。
class Father():
def __init__(self,age):
self.name = "父亲"
self.age = age
class Son(Father):
def __init__(self,age):
super(Son, self).__init__(age)
def speking(self):
print(f"我的名字是:{self.name},年龄是{self.age}")
person = Son("250")
person.speking()
在super()括号中,第一个参数表示子类,第二个参数表示子类的引用,而在后面init的括号中,表示需要传递的参数。
二、覆盖/重写(Overriding)
覆盖是指在子类中重新定义父类中已有的方法。覆盖的方法必须具有相同的方法名、参数列表和返回类型(或返回类型的子类型)。覆盖的目的是为了改变或扩展父类方法的行为。
重写和覆盖是同一个概念,只是不同的叫法。在某些文献中,重写可能更常用于描述方法的覆盖。
若不希望父类中的某个方法被子类覆盖,可以使用final修饰该方法。或者在定义父类的同时,使用final来修饰类,这样表示类中所有方法均不可覆盖。
三、重载(Overloading)
重载是指在同一个类中定义多个具有相同名称但参数列表不同的方法。Python不直接支持方法重载,但可以通过默认参数、可变参数等方式实现类似的效果。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def speak(self, sound=None): # 参数不同
if sound:
return f"{self.name} says {sound}!"
else:
return f"{self.name} says Woof!"
# 示例用法
dog = Dog("Buddy")
# 根据不同的参数列表,来选择用子类中还是父类中的方法。
print(dog.speak()) # 输出: Buddy says Woof!
print(dog.speak("Bark")) # 输出: Buddy says Bark!
四、扩展(Extension)
扩展通常指的是在子类中添加新的属性和方法,以增强或改变父类的功能。扩展是继承的一种应用,通过继承和扩展,子类可以拥有父类的所有特性,并且可以增加新的特性。
五、多态(Polymorphism)
多态是指同一个方法调用在不同的上下文中表现出不同的行为。多态可以通过重写、重载和接口实现等方式实现。多态使得代码更加灵活和可扩展。
六、封装(Encapsulation)
封装是指将数据(属性)和操作数据的方法(行为)绑定在一起,并隐藏对象的内部实现细节,只暴露必要的接口。封装可以保护对象的内部状态,防止外部直接访问和修改。
七、区别和分类
1.继承 vs 扩展
继承是子类获取父类的属性和方法。
扩展是在继承的基础上,子类添加新的属性和方法。
2.覆盖/重写 vs 重载
覆盖/重写是在子类中重新定义父类的方法,方法名和参数列表必须相同。
重载是在同一个类中定义多个具有相同名称但参数列表不同的方法(Python不直接支持方法重载)。
3.多态 vs 封装
多态是同一个方法调用在不同的上下文中表现出不同的行为。
封装是将数据和操作数据的方法绑定在一起,并隐藏对象的内部实现细节。
总结来说,这些术语描述了面向对象编程中的不同概念和机制,它们之间有重叠的部分,但每个术语都有其特定的含义和应用场景。理解这些术语有助于更好地设计和实现面向对象的程序。