python基础之面向对象

举报
坠入极夜的夏 发表于 2024/04/18 21:46:46 2024/04/18
【摘要】 面向对象编程(OOP)是一种以对象为中心的编程范式,通过对象和类实现现实世界的抽象。对象是程序的基本单元,类是对象的模板。主要特点包括:封装,通过访问修饰符隐藏对象内部细节,保证数据安全;继承,子类继承父类属性和方法,实现代码复用;多态,同方法调用在不同对象上产生不同行为,增强灵活性。示例代码展示了Python中的类定义、封装、继承和多态概念。

面向对象

面向对象(Object-Oriented Programming,简称OOP)是一种程序设计范式,它以“对象”为核心,将现实世界中的实体抽象为软件系统中的对象,通过对象之间的相互协作来实现复杂的功能。

特性:

对象(Object)与类:

对象(Object):

​ 对象是面向对象编程的基本单元,是对现实世界中实体的抽象。

类(Class):

​ 类是对象的模板或蓝图,它定义了一组共享相同属性和方法的对象的共同特征。通过创建类的实例(即对象),可以生成具有相同结构和行为的多个对象。类还可以通过继承机制实现代码复用。

class Car:
    def __init__(self, make, model, color):
        self.make = make
        self.model = model
        self.color = color
        self.speed = 0

    def accelerate(self, increment):
        self.speed += increment
        print(f"{self.make} {self.model} is now going at {self.speed} km/h.")

    def brake(self, decrement):
        self.speed -= decrement
        if self.speed < 0:
            self.speed = 0
        print(f"{self.make} {self.model} slowed down to {self.speed} km/h.")

# 创建一个Car对象实例
my_car = Car("Toyota", "Corolla", "Silver")

# 调用对象的方法
my_car.accelerate(50)
my_car.brake(30)
`Car` 是一个类,它定义了汽车对象共有的属性(`make``model``color``speed`)和方法(`accelerate``brake`)。

`__init__` 是一个特殊方法(构造函数),当创建类的实例时自动调用,用于初始化对象的属性。

`my_car``Car` 类的一个实例(对象),具有指定的制造商、型号、颜色和初始速度为0

封装(Encapsulation):

封装是指将对象的属性和方法封装在类内部,对外提供有限的接口(通常是方法)供其他对象访问。这样可以隐藏对象内部的复杂细节,保护数据安全,同时降低不同部分之间的耦合度。通过访问修饰符(如Python中的publicprivate等)控制属性和方法的可见性。

class Account:
    def __init__(self, balance=0):
        self.__balance = balance  # 使用双下划线(__)标记为私有属性

    def deposit(self, amount):
        self.__balance += amount
        print(f"存入金额: {amount}. 现金额: {self.__balance}")

    def withdraw(self, amount):
        if amount <= self.__balance:
            self.__balance -= amount
            print(f"取出金额: {amount}. 现金额: {self.__balance}")
        else:
            print("Insufficient funds.")

# 创建一个Account对象实例
my_account = Account(1000)

# 公开方法可以访问私有属性
my_account.deposit(int(input("请输入存入金额:")))
my_account.withdraw(int(input("请输入取出金额:")))

# 直接访问私有属性会引发错误
# my_account.__balance = 900  # AttributeError: 'Account' object has no attribute '__balance'
    __balance 是一个私有属性,使用双下划线前缀使其在外部无法直接访问,实现了封装。
    公开方法 deposit 和 withdraw 提供了对私有属性的受控访问,确保了账户余额操作的安全性。

继承(Inheritance):

继承允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类可以扩展或覆盖父类的行为,从而形成一个类的层次结构。继承有助于代码复用,减少冗余,并能体现类与类之间的“is-a”关系。例如,可以定义一个Vehicle基类,然后让Car、Truck等子类继承自Vehicle。

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("子类必须实现'speak()'方法。")

class Dog(Animal):
    def speak(self):
        return f"{self.name} 狗叫."

class Cat(Animal):
    def speak(self):
        return f"{self.name} 猫叫."

# 创建子类对象并调用继承的方法
my_dog = Dog("Buddy")
print(my_dog.speak())  # Buddy barks.

my_cat = Cat("Whiskers")
print(my_cat.speak())  # Whiskers meows.
Animal 是一个基类,定义了一个通用的 speak 方法,但并未给出具体实现,而是抛出 NotImplementedError 强制子类去实现。
Dog 和 Cat 分别继承自 Animal 类,实现了各自的 speak 方法,体现了动物叫声的差异。
创建 Dog 和 Cat 的实例后,可以直接调用从基类继承来的 speak 方法

多态(Polymorphism):

多态是指同一消息(即方法调用)作用于不同对象时产生不同的行为。有两种常见的多态形式:静态多态(通过函数重载或运算符重载实现)和动态多态(通过虚函数、接口或鸭子类型实现)。动态多态是面向对象的重要特性,它允许程序在运行时根据对象的实际类型确定应执行的方法,增强了代码的灵活性和可扩展性

class Shape:
    def area(self):
        raise NotImplementedError("子类必须实现'area()'方法。")

class Square(Shape):
    def __init__(self, side):
        self.side = side

    def area(self):
        return self.side ** 2

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        import math
        return math.pi * (self.radius ** 2)

shapes = [Square(5), Circle(4)]

for shape in shapes:
    print(f"{shape.__class__.__name__.lower()}的面积为:{shape.area()}.")
    Shape 是一个抽象基类,定义了 area 方法但未给出具体实现,要求子类提供。
    Square 和 Circle 分别继承自 Shape,各自实现了 area 方法,计算矩形和圆形的面积。
    将 Square 和 Circle 实例放入一个列表中,通过循环调用它们的 area 方法。尽管调用方式相同,但由于多态性,实际执行的是各自类中定义的方法,体现了“一个接口,多种实现”。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。