🚀 Python 面向对象编程全攻略:从入门到实践
面向对象编程(Object-Oriented Programming, OOP)是一种以“对象”为核心的编程范式,它通过封装、继承和多态等特性,让代码更模块化、易维护且可扩展。本文将带你全面掌握 Python 的面向对象编程,从基础概念到高级技巧,搭配丰富的示例代码和生动的比喻,助你轻松上手!
1. 什么是面向对象? 🤔
面向对象编程的核心思想是:将现实世界抽象为对象,每个对象包含属性(数据)和方法(行为)。
示例:一个简单的“猫”对象
Python |
---|
| class Cat:
def __init__(self, name, age):
self.name = name # 属性:名字
self.age = age # 属性:年龄
def meow(self): # 方法:喵喵叫
print(f"{self.name} says: Meow!")
# 实例化对象
my_cat = Cat("Whiskers", 3)
my_cat.meow() # 输出: Whiskers says: Meow!
|
2. 类与对象 🐱
2.1 类的定义
类是创建对象的模板,使用 class
关键字定义。
Python |
---|
| class Dog:
def __init__(self, name, breed):
self.name = name # 实例属性
self.breed = breed # 实例属性
def bark(self): # 实例方法
print(f"{self.name} is barking!")
|
2.2 实例化对象
通过类名后加括号创建对象(实例),每个对象独立拥有属性和方法。
Python |
---|
| dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "Poodle")
dog1.bark() # 输出: Buddy is barking!
dog2.bark() # 输出: Max is barking!
|
3. 封装与私有属性 🔒
封装是指将对象的内部状态(属性)隐藏起来,仅通过公共方法(接口)访问。
3.1 私有属性(双下划线前缀)
Python |
---|
| class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.__balance = balance # 私有属性
def deposit(self, amount):
self.__balance += amount
def get_balance(self):
return self.__balance
# 使用示例
account = BankAccount("Alice", 1000)
account.deposit(500)
print(account.get_balance()) # 输出: 1500
# print(account.__balance) # ❌ 报错!无法直接访问私有属性
|
💡 小贴士
- 私有属性防止外部直接修改数据,提高安全性。
- 通过公共方法(如
get_balance()
)控制对数据的访问。
4. 继承与多态 🐾
4.1 继承
子类可以继承父类的属性和方法,并扩展自己的功能。
Python |
---|
| class Animal:
def speak(self):
print("Animal speaks!")
class Cat(Animal): # Cat 继承 Animal
def speak(self): # 重写父类方法
print("Meow!")
class Dog(Animal):
def speak(self):
print("Woof!")
# 使用示例
animals = [Cat(), Dog()]
for animal in animals:
animal.speak()
|
输出:
4.2 多态
同一方法在不同类中有不同实现,通过统一接口调用。
Python |
---|
| def make_sound(animal):
animal.speak()
make_sound(Cat()) # 输出: Meow!
make_sound(Dog()) # 输出: Woof!
|
5. 高级特性 🌟
5.1 类属性与类方法
类属性属于整个类,所有实例共享。
Python |
---|
| class Student:
school = "Hope High" # 类属性
@classmethod
def change_school(cls, new_school):
cls.school = new_school
# 使用示例
print(Student.school) # 输出: Hope High
Student.change_school("Star Academy")
print(Student.school) # 输出: Star Academy
|
5.2 静态方法
与类和实例无关,用于组织逻辑相关的方法。
Python |
---|
| class MathUtils:
@staticmethod
def add(a, b):
return a + b
print(MathUtils.add(3, 5)) # 输出: 8
|
5.3 属性装饰器(@property
)
将方法转换为属性访问形式,实现更优雅的数据管理。
Python |
---|
| class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def fahrenheit(self):
return (self._celsius * 9/5) + 32
# 使用示例
temp = Temperature(25)
print(temp.fahrenheit) # 输出: 77.0
|
6. 实战案例:图书管理系统 📚
6.1 类设计
Python |
---|
| class Book:
def __init__(self, title, author):
self.title = title
self.author = author
self.checked_out = False
def check_out(self):
self.checked_out = True
def return_book(self):
self.checked_out = False
class Library:
def __init__(self):
self.books = []
def add_book(self, book):
self.books.append(book)
def find_books_by_author(self, author):
return [book for book in self.books if book.author == author]
|
6.2 使用示例
Python |
---|
| # 创建书籍
book1 = Book("Python入门", "张三")
book2 = Book("Java进阶", "李四")
# 创建图书馆并添加书籍
library = Library()
library.add_book(book1)
library.add_book(book2)
# 查找作者为“张三”的书籍
found_books = library.find_books_by_author("张三")
for book in found_books:
print(f"{book.title} by {book.author}")
|
输出:
7. 常见问题与技巧 🧩
Q1: 如何判断两个对象是否相等?
使用 ==
比较对象的值,is
比较对象的内存地址。
Python |
---|
| a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True(值相等)
print(a is b) # False(不同对象)
print(a is c) # True(同一对象)
|
Q2: 如何实现运算符重载?
通过定义特殊方法(如 __add__
, __lt__
等)。
Python |
---|
| class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __str__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2 # 调用 __add__
print(v3) # 输出: Vector(4, 6)
|
Q3: 如何避免重复代码?
通过组合(has-a)或继承(is-a)复用代码。