【100天精通python】Day13:面向对象编程_多态和封装,实战模拟电影院的自动售票机选票页面
目录
1 多态(Polymorphism)
2 封装(Encapsulation)
3 总结
4 实战:模拟电影院的自动售票机选票页面
在 Python 中,多态和封装是面向对象编程的两个重要概念。
1 多态(Polymorphism)
多态是指同一个方法可以根据不同的对象类型产生不同的行为。在 Python 中,多态是通过方法的动态绑定实现的,即方法的调用在运行时根据对象的类型确定。这使得代码更加灵活,可以处理不同类型的对象而无需关心对象的具体类型。
class Animal:def speak(self):passclass 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 = makeself._model = modelself._speed = 0def accelerate(self, amount):self._speed += amountdef brake(self, amount):self._speed -= amountdef get_speed(self):return self._speedcar = 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 = titleself.showtimes = showtimesself.available_seats = available_seatsclass TicketMachine:def __init__(self):self.movies = []self.current_movie = Noneself.current_showtime = Noneself.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 文件,运行上面代码,结果如下:

请注意,以上示例是一个简单的模拟,并没有实际购票功能,仅用于展示流程。在实际应用中,我们需要与数据库或其他系统进行交互,并添加更多复杂的功能,如用户登录、支付等。此示例仅供参考,您可以根据实际需求进行扩展。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
