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

相关推荐
程序员卷卷狗1 分钟前
JVM 内存结构与 GC 调优全景图
java·开发语言·jvm
盘古开天166630 分钟前
从零开始:如何搭建你的第一个简单的Flask网站
后端·python·flask
用户214118326360230 分钟前
Claude Skills 从零到一:手把手打造专属公众号文风生成器,10 分钟搞定 AI 技能定制
后端
追逐时光者1 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 60 期(2025年11.1-11.9)
后端·.net
foxbillcsdn1 小时前
《Redis应用实例》Java实现(28):栈
java·redis
码上成长1 小时前
GraphQL:让前端自己决定要什么数据
前端·后端·graphql
serendipity_hky1 小时前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud
Geoking.1 小时前
【Java】Java 中 @Resource 与 @Autowired 的区别详解
java·开发语言
weixin_441455262 小时前
说说Java有哪些集合类
java·开发语言