面向对象编程(Object-oriented programming,OOP)的三大特性——封装、继承和多态。
1. 封装:保护数据和隐藏实现细节
封装:隐藏对象的内部状态和行为实现细节,仅通过一个定义良好的接口与对象交互。
class Account:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # 私有属性
def deposit(self, amount):
if amount > 0:
self.__balance += amount
print("存款成功")
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
print("取款成功")
def get_balance(self):
return self.__balance
- 封装细节:私有属性
__balance
阻止了外部直接访问和修改账户余额,这保护了数据的完整性。 - 公共接口:通过
deposit
和withdraw
方法提供的公共接口,允许在检查合法性的前提下进行交互,确保了操作的安全性。 - 数据获取:
get_balance
方法提供了一种安全的方式来获取账户余额,而不允许直接访问内部数据。
补充:在属性名前使用双下划线 __
使其变为私有,防止直接访问这些属性,从而实现封装。
2. 继承:提高代码复用性
继承允许一个类(子类)继承另一个类(父类)的属性和方法。这使得开发者可以建立一个层次化的类结构,提高代码的复用性,并使得代码结构更加清晰。
class Person:
def __init__(self, name):
self.name = name
def introduce(self):
print(f"名字: {self.name}")
class Student(Person):
def __init__(self, name, school):
super().__init__(name)
self.school = school
def introduce(self):
super().introduce()
print(f"学校: {self.school}")
# 使用
student = Student("Alice", "MIT")
student.introduce()
- 基类(Person):负责管理人的基本信息,如名字。
- 派生类(Student):扩展了基类,增加了学校信息,并重写了
introduce
方法来包含学校信息。 - 方法调用:
super().introduce()
在派生类中调用基类的introduce
方法,确保了名字的正确介绍,并在其后添加了学校信息。
3. 多态:接口一致,实现多样
多态是指同一个接口可以被不同的对象以不同的方式实现。
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
print("Woof!")
class Cat(Animal):
def speak(self):
print("Meow!")
def animal_sound(animal):
animal.speak()
# 使用
dog = Dog()
cat = Cat()
animal_sound(dog)
animal_sound(cat)
Animal
类定义了一个 speak
方法,但没有具体实现。
Dog
和 Cat
类继承了 Animal
并重写了 speak
方法以提供具体的实现。
animal_sound
函数演示了如何通过传递不同的对象来调用同一方法,这些对象表现出不同的行为。这就是多态的实质:相同的函数调用,根据传入的对象的类型,可以产生不同的行为。
推荐我的相关专栏: python 错误记录