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

相关推荐
小楓12017 分钟前
後端開發技術教學(三) 表單提交、數據處理
前端·后端·html·php
2501_9179700319 分钟前
主播生活模拟器2|主播人生模拟器2 (Streamer Life Simulator 2)免安装中文版
java·游戏·生活
破刺不会编程19 分钟前
linux信号量和日志
java·linux·运维·前端·算法
bobz9651 小时前
windows 配置 conda 环境变量
后端
回家路上绕了弯1 小时前
线程池优化实战:从性能瓶颈到极致性能的演进之路
java·后端
bobz9651 小时前
pycharm pro 安装插件失败
后端
小苏兮1 小时前
飞算JavaAI深度解析:专为Java生态而生的智能引擎
java·开发语言·人工智能·java开发·飞算javaai炫技赛
前端卧龙人2 小时前
不到五分钟,太强了,Trae就帮我完成了会员卡片展示!
trae
丘山子3 小时前
如何规避 A/B Testing 中的致命错误?何时进行 A/B 测试?
前端·后端·面试
用户84913717547163 小时前
JDK 17 实战系列(第4期):安全性与稳定性增强详解
java·后端·性能优化