java程序员怎么从Python小白变成Python大拿?(三)

文章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!

练习题

  1. 定义一个​Rectangle​类,包含​width​​height​属性,以及计算面积和周长的方法。
  2. 创建一个​ElectricCar​类,继承自​Car​类(需自行定义),并添加​battery_level​属性及充电方法。
  3. 实现一个​BankAccount​类,包含存款、取款、计算利息等方法,并使用封装保护余额属性。
  4. ​Vector​类添加​__sub__​方法,支持向量减法操作。

通过掌握OOP,你可以更高效地组织代码,复用逻辑,并构建复杂的应用程序。继续练习和探索,逐步掌握高级主题如抽象类、接口和元类!

相关推荐
一直_在路上12 小时前
Go项目实战案例解析】:以Go语言之道,构建电商高并发架构
后端·架构
兵临天下api12 小时前
微店 item_get 接口深度深度分析及 Python 实现
trae
tan180°12 小时前
Boost搜索引擎 查找并去重(3)
linux·c++·后端·搜索引擎
SimonKing12 小时前
Apache Commons Math3 使用指南:强大的Java数学库
java·后端·程序员
渣哥12 小时前
Java 集合迭代中的 fail-fast 与 fail-safe 机制详解
java
uhakadotcom12 小时前
DuckDB相比于ClickHouse有什么不同点和优势?
后端·面试·github
在逃牛马12 小时前
【Uni-App+SSM+宠物实战】Day2:后端初始化
后端
帧栈12 小时前
我的创作纪念日
java
qq_1728055912 小时前
Go 自建库的使用教程与测试
开发语言·后端·golang
irving同学4623812 小时前
TypeORM 列装饰器完整总结
前端·后端·nestjs