9. python面向对象编程

2024-05-16

面向对象编程

面向对象编程(OOP)是一种编程范式,使用“对象”来组织代码。对象是类的实例,类定义了对象的属性和方法。

类和对象

  • 类是对象的蓝图或模板,定义了对象的属性和行为。
# 定义一个类
class Dog: # 相当于Dog(object)
    # 初始化方法
    def __init__(self, name, age):
        self.name = name
        self.age = age
  
    # 实例方法
    def bark(self):
        print(f"{self.name} is barking")

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

# 访问对象属性
print(my_dog.name)  # 输出 "Buddy"
print(my_dog.age)   # 输出 3

# 调用对象方法
my_dog.bark()  # 输出 "Buddy is barking"

继承

  • 继承是面向对象编程的一个重要特性,允许一个类继承另一个类的属性和方法。基类(父类)和派生类(子类)之间存在继承关系。
# 定义基类
class Animal:
    def __init__(self, name):
        self.name = name
  
    def speak(self):
        print(f"{self.name} is making a sound")

# 定义派生类
class Cat(Animal):
    def __init__(self, name, color):
        super().__init__(name)
        self.color = color
  
    def speak(self):
        print(f"{self.name} is meowing")

# 创建派生类对象
my_cat = Cat("Whiskers", "white")

# 访问派生类对象属性和方法
print(my_cat.name)   # 输出 "Whiskers"
print(my_cat.color)  # 输出 "white"
my_cat.speak()       # 输出 "Whiskers is meowing"

多态

多态是指不同类的对象可以通过相同的接口调用方法,产生不同的行为。通常通过方法重载实现。

# 示例代码
class Bird(Animal):
    def speak(self):
        print(f"{self.name} is chirping")

# 定义一个函数,接受一个动物对象
def animal_speak(animal):
    animal.speak()

# 创建不同的动物对象
dog = Dog("Buddy", 3)
cat = Cat("Whiskers", "white")
bird = Bird("Tweety")

# 调用函数
animal_speak(dog)   # 输出 "Buddy is barking"
animal_speak(cat)   # 输出 "Whiskers is meowing"
animal_speak(bird)  # 输出 "Tweety is chirping"

封装

封装是指将对象的属性和方法私有化,保护对象的内部状态不被外部直接访问和修改。通过定义公有和私有方法和属性实现封装。

# 示例代码
class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self.__balance = balance  # 私有属性

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
        else:
            print("存款金额必须大于零")

    def withdraw(self, amount):
        if amount <= self.__balance:
            self.__balance -= amount
        else:
            print("余额不足")

    def get_balance(self):
        return self.__balance

# 创建对象
account = BankAccount("Alice", 1000)

# 访问公有属性和方法
print(account.owner)  # 输出 "Alice"
account.deposit(500)
account.withdraw(200)
print(account.get_balance())  # 输出 1300

# 试图访问私有属性(会报错)
# print(account.__balance)

通过掌握面向对象编程的基本概念和技巧,你可以编写更具结构化、可扩展性和可维护性的代码。

私有属性

在面向对象编程中,让类属性能够被直接访问是危险的。使用私有属性可以保证属性不能被直接访问修改,增强安全性。私有属性用__(双下划线)前缀进行标识。

#-- coding:UTF-8 --
# 定义一个类
class Dog:
    # 初始化方法
    def __init__(self, name, age):
        self.name = name
        self.__age = age # __age为私有属性


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

# 访问对象属性
print(my_dog.name)  # 输出 "Buddy"
#print(my_dog.__age)   # 无法访问

# 强制访问私有属性
print(my_dog._Dog__age)