文章3:面向对象编程(OOP)在Python中的应用
目标
学习如何使用Python实现面向对象编程(OOP),掌握类、对象、继承、多态、封装以及特殊方法的使用。
一、类(Class)和对象(Object)
1. 类的定义
类是对象的模板,定义对象的属性(数据)和方法(行为)。
python
class Dog:
# 类属性(所有实例共享)
species = "Canis familiaris"
# 初始化方法(构造函数)
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age
# 实例方法
def description(self):
return f"{self.name} is {self.age} years old"
def speak(self, sound):
return f"{self.name} says {sound}"
2. 对象的创建与使用
bash
# 创建对象(实例化)
my_dog = Dog("Buddy", 3)
# 访问属性和方法
print(my_dog.description()) # 输出:"Buddy is 3 years old"
print(my_dog.speak("Woof!")) # 输出:"Buddy says Woof!"
二、继承(Inheritance)
1. 继承的语法
通过继承,子类可以继承父类的属性和方法,并可扩展或覆盖它们。
ruby
class GoldenRetriever(Dog): # 继承Dog类
def __init__(self, name, age, color):
super().__init__(name, age) # 调用父类构造函数
self.color = color # 子类新增属性
# 覆盖父类方法
def speak(self):
return f"{self.name} says Woof! (Golden Retriever)"
2. 多态(Polymorphism)
不同子类可以实现相同的方法,但行为不同。
ruby
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
return f"{self.name} says Meow!"
def animal_sound(animal):
print(animal.speak())
dog = Dog("Buddy", 3)
cat = Cat("Whiskers", 2)
animal_sound(dog) # 输出:"Buddy says Woof!"
animal_sound(cat) # 输出:"Whiskers says Meow!"
三、封装(Encapsulation)与私有成员
1. 封装
通过将数据和方法包装在类中,控制对内部状态的访问。
- 公有属性:直接访问(无下划线)。
- 受保护属性 :单下划线
_
(约定不可直接访问)。 - 私有属性 :双下划线
__
(Python通过名称改编限制访问)。
ruby
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # 私有属性
# 访问私有属性的方法(getter)
def get_balance(self):
return self.__balance
# 修改私有属性的方法(setter)
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
2. 属性装饰器
使用 @property
和 @setter
装饰器简化封装:
ruby
class Circle:
def __init__(self, radius):
self.__radius = radius
@property
def radius(self):
return self.__radius
@radius.setter
def radius(self, value):
if value >= 0:
self.__radius = value
else:
raise ValueError("Radius cannot be negative")
四、特殊方法(Magic Methods)
1. 常用特殊方法
方法 | 作用 | 示例 |
---|---|---|
__init__(self, ...) |
构造方法(初始化对象) | def __init__(self): ... |
__str__(self) |
返回对象的可读字符串表示 | return "Object info" |
__repr__(self) |
返回对象的官方字符串表示(调试用) | return "repr_info" |
__len__(self) |
返回对象的长度(如容器) | return len(self.items) |
__add__(self, other) |
定义加法操作(+ ) |
return self + other |
2. 示例:自定义Vector类
python
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Vector({self.x}, {self.y})"
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __len__(self):
import math
return math.sqrt(self.x**2 + self.y**2)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # 输出:"Vector(4, 6)"
print(len(v1)) # 输出:2.2360679775...
五、综合示例:动物收容所系统
python
class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
def __str__(self):
return f"{self.name} ({self.species})"
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
return "Woof!"
class Cat(Animal):
def make_sound(self):
return "Meow!"
class Shelter:
def __init__(self):
self.animals = []
def add_animal(self, animal):
self.animals.append(animal)
def display_animals(self):
for animal in self.animals:
print(f"{animal}: {animal.make_sound()}")
# 使用示例
shelter = Shelter()
shelter.add_animal(Dog("Buddy", "Dog"))
shelter.add_animal(Cat("Whiskers", "Cat"))
shelter.display_animals()
输出:
scss
Buddy (Dog): Woof!
Whiskers (Cat): Meow!
练习题
- 定义一个
Rectangle
类,包含width
和height
属性,以及计算面积和周长的方法。 - 创建一个
ElectricCar
类,继承自Car
类(需自行定义),并添加battery_level
属性及充电方法。 - 实现一个
BankAccount
类,包含存款、取款、计算利息等方法,并使用封装保护余额属性。 - 为
Vector
类添加__sub__
方法,支持向量减法操作。
通过掌握OOP,你可以更高效地组织代码,复用逻辑,并构建复杂的应用程序。继续练习和探索,逐步掌握高级主题如抽象类、接口和元类!