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

77 阅读3分钟

文章3:面向对象编程(OOP)在Python中的应用

目标

学习如何使用Python实现面向对象编程(OOP),掌握类、对象、继承、多态、封装以及特殊方法的使用。


一、类(Class)和对象(Object)

1. 类的定义

类是对象的模板,定义对象的属性(数据)和方法(行为)。

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. 对象的创建与使用

# 创建对象(实例化)
my_dog = Dog("Buddy", 3)

# 访问属性和方法
print(my_dog.description())    # 输出:"Buddy is 3 years old"
print(my_dog.speak("Woof!"))   # 输出:"Buddy says Woof!"

二、继承(Inheritance)

1. 继承的语法

通过继承,子类可以继承父类的属性和方法,并可扩展或覆盖它们。

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)

不同子类可以实现相同的方法,但行为不同。

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通过名称改编限制访问)。
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​​ 装饰器简化封装:

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类

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...

五、综合示例:动物收容所系统

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()

输出:

Buddy (Dog): Woof!
Whiskers (Cat): Meow!

练习题

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

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