【100天精通python】Day13:面向对象编程_多态和封装,实战模拟电影院的自动售票机选票页面

简介: 【100天精通python】Day13:面向对象编程_多态和封装,实战模拟电影院的自动售票机选票页面

在 Python 中,多态和封装是面向对象编程的两个重要概念。

1 多态(Polymorphism)

       多态是指同一个方法可以根据不同的对象类型产生不同的行为。在 Python 中,多态是通过方法的动态绑定实现的,即方法的调用在运行时根据对象的类型确定。这使得代码更加灵活,可以处理不同类型的对象而无需关心对象的具体类型。

class Animal:
    def speak(self):
        pass
class Dog(Animal):
    def speak(self):
        return "Woof!"
class Cat(Animal):
    def speak(self):
        return "Meow!"
def make_sound(animal):
    return animal.speak()
dog = Dog()
cat = Cat()
print(make_sound(dog))  # 输出:Woof!
print(make_sound(cat))  # 输出:Meow!

在上面的示例中,我们定义了一个 Animal 基类和两个子类 Dog 和 Cat,它们都重写了基类的 speak 方法。然后,我们定义了一个 make_sound 函数,它接受一个 Animal 类型的参数,并调用其 speak 方法。当我们传入不同类型的对象(Dog 和 Cat)给 make_sound 函数时,由于多态的特性,该函数会根据传入的对象类型调用不同的 speak 方法,实现了多态性。

2 封装(Encapsulation)

        封装是指将数据和对数据的操作封装在一个对象中,对外部隐藏内部的实现细节。在 Python 中,封装是通过将数据和方法定义在类中,并使用访问修饰符来控制外部对内部数据的访问权限实现的。封装可以确保数据的安全性和完整性,并提供了良好的抽象,使得外部代码只能通过类的公共接口来访问和操作数据。

示例:

class Car:
    def __init__(self, make, model):
        self._make = make
        self._model = model
        self._speed = 0
    def accelerate(self, amount):
        self._speed += amount
    def brake(self, amount):
        self._speed -= amount
    def get_speed(self):
        return self._speed
car = Car("Toyota", "Corolla")
car.accelerate(50)
print(car.get_speed())  # 输出:50
# 尝试直接访问对象的内部数据,将会得到错误
# print(car._speed)  # 错误:AttributeError: 'Car' object has no attribute '_speed'

在上面的示例中,我们定义了一个 Car 类,封装了车辆的数据和方法。使用私有变量(以单下划线开头)来表示内部数据,以及公共方法来操作数据。这样,外部代码无法直接访问对象的内部数据,只能通过公共方法来访问和操作数据,实现了封装性。

3 总结

多态和封装是面向对象编程中的两个重要概念。

多态使得相同的方法能够处理不同类型的对象,增加了代码的灵活性和可重用性。

封装将数据和方法封装在对象中,对外部隐藏内部实现细节,确保了数据的安全性和完整性,并提供了良好的抽象。

在 Python 中,我们可以通过继承和访问修饰符来实现多态和封装的特性。

4 实战:模拟电影院的自动售票机选票页面

为了模拟电影院的自动售票机选票页面,我们可以创建一个简单的 Python 程序,让用户选择电影、座位和购票数量。以下是一个基本示例:

class Movie:
    def __init__(self, title, showtimes, available_seats):
        self.title = title
        self.showtimes = showtimes
        self.available_seats = available_seats
class TicketMachine:
    def __init__(self):
        self.movies = []
        self.current_movie = None
        self.current_showtime = None
        self.selected_seats = []
    def add_movie(self, movie):
        self.movies.append(movie)
    def show_movies(self):
        print("Movies available:")
        for idx, movie in enumerate(self.movies, start=1):
            print(f"{idx}. {movie.title}")
    def select_movie(self, movie_idx):
        self.current_movie = self.movies[movie_idx - 1]
        self.show_movie_showtimes()
    def show_movie_showtimes(self):
        print(f"Showtimes for '{self.current_movie.title}':")
        for idx, showtime in enumerate(self.current_movie.showtimes, start=1):
            print(f"{idx}. {showtime}")
    def select_showtime(self, showtime_idx):
        self.current_showtime = self.current_movie.showtimes[showtime_idx - 1]
        self.show_available_seats()
    def show_available_seats(self):
        print("Available seats:")
        for seat in self.current_movie.available_seats:
            if seat not in self.selected_seats:
                print(seat)
    def select_seats(self, seats):
        self.selected_seats.extend(seats)
    def buy_tickets(self):
        total_price = len(self.selected_seats) * 10  # 假设每张票价格为10元
        print(f"Total price: {total_price} yuan")
        self.current_movie.available_seats = [seat for seat in self.current_movie.available_seats if seat not in self.selected_seats]
        print("Tickets purchased successfully!")
if __name__ == "__main__":
    # 创建电影对象
    movie1 = Movie("Movie 1", ["10:00 AM", "2:00 PM", "6:00 PM"], ["A1", "A2", "B1", "B2"])
    movie2 = Movie("Movie 2", ["11:00 AM", "3:00 PM", "7:00 PM"], ["C1", "C2", "D1", "D2"])
    # 创建售票机对象
    ticket_machine = TicketMachine()
    ticket_machine.add_movie(movie1)
    ticket_machine.add_movie(movie2)
    # 用户选票流程
    print("Welcome to the Ticket Machine!")
    ticket_machine.show_movies()
    movie_choice = int(input("Select a movie (enter the movie number): "))
    ticket_machine.select_movie(movie_choice)
    showtime_choice = int(input("Select a showtime (enter the showtime number): "))
    ticket_machine.select_showtime(showtime_choice)
    print("Select your seats (enter seat numbers separated by spaces):")
    seats_choice = input().split()
    ticket_machine.select_seats(seats_choice)
    ticket_machine.buy_tickets()

在python IDLE中创建 tickets.py 文件,运行上面代码,结果如下:

5eda4b94859f4e479d6512c01910a838.png

请注意,以上示例是一个简单的模拟,并没有实际购票功能,仅用于展示流程。在实际应用中,我们需要与数据库或其他系统进行交互,并添加更多复杂的功能,如用户登录、支付等。此示例仅供参考,您可以根据实际需求进行扩展。  


目录
相关文章
|
28天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
13天前
|
设计模式 Python
简单分享下python多态
多态是面向对象编程中至关重要的特性,通过继承和方法重写,可以实现代码复用和灵活扩展。Python的鸭子类型进一步增强了多态的灵活性,使得代码更具适应性。通过理解和应用多态,可以写出更为简洁、优雅和高效的代码。
48 9
|
28天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
46 10
|
2月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
2月前
|
并行计算 调度 开发者
探索Python中的异步编程:从基础到实战
在Python的世界里,异步编程是一种让程序运行更加高效、响应更快的技术。本文不仅会介绍异步编程的基本概念和原理,还将通过具体代码示例展示如何在Python中实现异步操作。无论你是初学者还是有经验的开发者,都能从中获益,了解如何运用这一技术优化你的项目。
|
2月前
|
数据处理 Python
探索Python中的异步编程:从基础到实战
在Python的世界中,“速度”不仅是赛车手的追求。本文将带你领略Python异步编程的魅力,从原理到实践,我们不单单是看代码,更通过实例感受它的威力。你将学会如何用更少的服务器资源做更多的事,就像是在厨房里同时烹饪多道菜而不让任何一道烧焦。准备好了吗?让我们开始这场技术烹饪之旅。
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
2月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
66 0
|
2月前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
42 0