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

相关推荐
大鸡腿同学18 小时前
【成长类】《只有偏执狂才能生存》读书笔记:程序员的偏执型成长地图
后端
0xDevNull18 小时前
MySQL数据冷热分离详解
后端·mysql
一定要AK18 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao18 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
AI袋鼠帝19 小时前
OpenClaw(龙虾)最强开源对手!Github 40K Star了,又一个爆火的Agent..
后端
KevinCyao19 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏49419 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
wuxinyan12320 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书20 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队20 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能