当前位置:   article > 正文

Python中类(class)的使用方法_python class用法

python class用法

  在Python中,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式或编程风格,它使用“对象”来设计应用程序和程序。面向对象的主要概念包括类、对象、继承、封装和多态,这里主要介绍下Python中关于类(Class)的操作。

在Python中,类是创建对象的蓝图或模板,类定义了对象的属性和方法,对象是类的实例。这里使用了埃里克.马瑟斯著的《Python编程:从入门到实践》中的小节练习作为案例 

1.创建和使用类

在Python中使用class关键字来定义类。

练习题1:餐馆

  创建一个一个名为Restaurant的类,为其方法__init__()设置属性restaurant_name和cuisine_type。创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法,前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。 根据这个类创建一个名为restaurant的实例,分别打印其两个属性,再调用前述两个方法。

  1. """
  2. 创建一个名为Restaurant的类,
  3. 为其方法__init__()设置属性restaurant_name和cuisine_type。
  4. """
  5. class Restaurant:
  6. def __init__(self, restaurant_name, cuisine_type):
  7. self.restaurant_name = restaurant_name
  8. self.cuisine_type = cuisine_type
  9. """
  10. 创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法,
  11. 前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。
  12. """
  13. def describe_restaurant(self):
  14. print(f"{self.restaurant_name}")
  15. print(f"{self.cuisine_type}")
  16. def open_restaurant(self):
  17. print(f"{self.restaurant_name}")
  18. # 根据Restaurant类创建一个名为restaurant的实例
  19. restaurant = Restaurant("老八餐厅", "奥利给")
  20. # 分别打印其两个属性
  21. print(f"{restaurant.restaurant_name}")
  22. print(f"{restaurant.cuisine_type}")
  23. # 调用describe_restaurant()方法
  24. restaurant.describe_restaurant()
  25. # 调用open_restaurant()方法
  26. restaurant.open_restaurant()
'
运行

练习题2:三家餐馆

  根据习题1编写的类创建三个实例,并对每个实例调用方法describe_restaurant()。

  1. # 调用习题1中创建的Restaurant类
  2. from 餐馆 import Restaurant
  3. # 创建三个Restaurant类的实例
  4. restaurant1 = Restaurant("老八餐厅", "奥利给")
  5. restaurant2 = Restaurant("老八大餐", "奥利给")
  6. restaurant3 = Restaurant("老八天堂", "奥利给")
  7. # 对每个实例调用describe_restaurant()方法
  8. restaurant1.describe_restaurant()
  9. restaurant2.describe_restaurant()
  10. restaurant3.describe_restaurant()

习题3:用户

  创建一个名为User的类,其中包含属性first_name和last_name,以及用户简介通常会存储的其他几个属性。在类User中定义一个名为describe_user()的方法,用于打印用户信息摘要。再定义一个名为greet_user()的方法,用于向用户发出个性化的问候。 创建多个表示不同用户的实例,并对每个实例调用上述两个方法。

  1. class User:
  2. def __init__(self, first_name, last_name):
  3. self.first_name = first_name
  4. self.last_name = last_name
  5. def describe_user(self):
  6. print(f"欢迎 {self.first_name} {self.last_name} 来到老八餐厅!")
  7. def greet_user(self):
  8. print(f"你好,{self.first_name} {self.last_name}!祝您用餐愉快!")
  9. user1 = User("张三", "李四")
  10. user2 = User("王五", "赵六")
  11. user3 = User("孙七", "周八")
  12. # 对每个实例调用describe_user()和greet_user()方法
  13. users = [user1, user2, user3]
  14. for user in users:
  15. user.describe_user()
  16. user.greet_user()
  17. print()
'
运行
2.使用类和实例 

当定义了一个类时,可以创建它的实例,并访问它的属性和方法

习题4:就餐人数
  在为完成练习1而编写的程序中,添加一个名为number_served的属性,并将其默认值设置为0。根据这个类创建一个名为restaurant的实例。打印有多少人在这家餐馆就餐过,然后修改这个值并再次打印它。 添加一个名为set_number_served()的方法,让你能够设置就餐人数。调用这个方法并向它传递一个值,然后再次打印这个值。 添加一个名为increment_number_served()的方法,让你能够将就餐人数递增。调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。

  1. # 在 餐厅.py 上进行修改
  2. class Restaurant:
  3. def __init__(self, restaurant_name, cuisine_type):
  4. self.restaurant_name = restaurant_name
  5. self.cuisine_type = cuisine_type
  6. self.number_served = 0
  7. def describe_restaurant(self):
  8. print(f"餐厅名称: {self.restaurant_name}")
  9. print(f"菜系类型: {self.cuisine_type}")
  10. def set_number_served(self, number):
  11. self.number_served = number
  12. print(f"在 {self.restaurant_name} 就餐的人数已设置为: {self.number_served}")
  13. def increment_number_served(self, increment_by):
  14. self.number_served += increment_by
  15. print(f"在 {self.restaurant_name} 就餐的人数已增加 {increment_by} 人,当前总人数: {self.number_served}")
  16. def get_number_served(self):
  17. print(f"至今已有 {self.number_served} 人在 {self.restaurant_name} 用餐。")
  18. # 根据Restaurant类创建一个名为restaurant的实例
  19. restaurant = Restaurant("老八餐厅", "奥利给")
  20. # 分别打印其两个属性
  21. print(f"餐厅名称: {restaurant.restaurant_name}")
  22. print(f"菜系类型: {restaurant.cuisine_type}")
  23. # 调用方法
  24. restaurant.describe_restaurant()
  25. restaurant.get_number_served()
  26. restaurant.set_number_served(20)
  27. restaurant.get_number_served()
  28. restaurant.increment_number_served(5)
  29. restaurant.get_number_served()
'
运行

习题5:尝试登录次数

  在为完成练习3而编写的User类中,添加一个名为login_attempts的属性。编写一个名为increment_login_attempts()的方法,将属性login_attempts的值加1。再编写一个名为reset_login_attempts()的方法,将属性login_attempts的值重置为0。 根据User类创建一个实例,再调用方法increment_login_attempts()多次。打印属性login_attempts的值,确认它被正确地递增。然后,调用方法reset_login_attempts(),并再次打印属性login_attempts的值,确认它被重置为0。

  1. # 在 用户.py 上进行修改
  2. class User:
  3. def __init__(self, first_name, last_name):
  4. self.first_name = first_name
  5. self.last_name = last_name
  6. self.login_attempts = 0
  7. def describe_user(self):
  8. print(f"欢迎 {self.first_name} {self.last_name} 来到老八餐厅!")
  9. def greet_user(self):
  10. print(f"你好,{self.first_name} {self.last_name}!祝您用餐愉快!")
  11. def increment_login_attempts(self):
  12. self.login_attempts += 1
  13. def reset_login_attempts(self):
  14. self.login_attempts = 0
  15. def print_login_attempts(self):
  16. print(f"{self.first_name} {self.last_name} 的登录尝试次数: {self.login_attempts}")
  17. # 创建实例
  18. user1 = User("老八", "八妹")
  19. # 调用increment_login_attempts()方法多次
  20. user1.increment_login_attempts()
  21. user1.increment_login_attempts()
  22. user1.increment_login_attempts()
  23. # 打印login_attempts的值
  24. user1.print_login_attempts()
  25. # 调用reset_login_attempts()方法
  26. user1.reset_login_attempts()
  27. # 再次打印login_attempts的值,确认它已经重置为0
  28. user1.print_login_attempts()
'
运行
3.继承

在Python中,一个类可以继承另一个类的属性和方法,被称为继承。被继承的类称为父类(或基类),继承的类称为子类(或派生类)。 

习题6:冰激凌小店

  冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,让它继承为完成练习9-1或练习9-4而编写的Restaurant类。这两个版本的Restaurant类都可以,挑选你更喜欢的那个即可。添加一个名为flavors的属性,用于存储一个由各种口味的冰激凌组成的列表。编写一个显示这些冰激凌的方法。创建一个IceCreamStand实例,并调用这个方法。

  1. # 修改自 餐馆.py
  2. class Restaurant:
  3. def __init__(self, restaurant_name, cuisine_type):
  4. self.restaurant_name = restaurant_name
  5. self.cuisine_type = cuisine_type
  6. def describe_restaurant(self):
  7. print(f"餐厅名称: {self.restaurant_name}")
  8. print(f"菜式类型: {self.cuisine_type}")
  9. # 继承Restaurant类
  10. class IceCreamStand(Restaurant):
  11. def __init__(self, restaurant_name, flavors):
  12. # 调用父类的初始化方法
  13. super().__init__(restaurant_name, "冰淇淋")
  14. # 添加flavors属性
  15. self.flavors = flavors
  16. def display_flavors(self):
  17. print(f"{self.restaurant_name} 的冰淇淋口味:")
  18. for flavor in self.flavors:
  19. print(f"- {flavor}")
  20. # 创建一个IceCreamStand实例
  21. ice_cream_stand = IceCreamStand("老八之家", ["臭豆腐味", "火鸡面味", "大辣椒味", "朱老六味"])
  22. # 调用父类继承的方法
  23. ice_cream_stand.describe_restaurant()
  24. # 调用新添加的方法来显示冰淇淋口味
  25. ice_cream_stand.display_flavors()
'
运行

习题7:管理员 

  管理员是一种特殊的用户。编写一个名为Admin的类,让它继承为完成练习3或练习5而编写的User类。添加一个名为privileges的属性,用于存储一个由字符串(如"can add post"、"can delete post"、"can ban user"等)组成的列表。编写一个名为show_privileges()的方法,显示管理员的权限。创建一个Admin实例,并调用这个方法。

  1. from 用户 import User
  2. # 继承User类创建Admin类
  3. class Admin(User):
  4. def __init__(self, first_name, last_name):
  5. super().__init__(first_name, last_name) # 调用父类的构造函数
  6. self.privileges = [ # 添加privileges属性
  7. "can add post",
  8. "can delete post",
  9. "can ban user"
  10. ]
  11. # 添加show_privileges方法
  12. def show_privileges(self):
  13. print(f"{self.first_name} {self.last_name} 的权限有:")
  14. for privilege in self.privileges:
  15. print(f"- {privilege}")
  16. # 创建一个Admin实例并调用方法
  17. admin = Admin("管理员", "张三")
  18. admin.describe_user()
  19. admin.greet_user()
  20. admin.show_privileges()

习题8:权限 

编写一个名为Privileges的类,它只有一个属性privileges,其中存储了练习7所述的字符串列表。将方法show_privileges()移到这个类中。在Admin类中,将一个Privileges实例用作其属性。创建一个Admin实例,并使用方法show_privileges()来显示其权限。

  1. class Privileges:
  2. def __init__(self):
  3. self.privileges = [
  4. "can add post",
  5. "can delete post",
  6. "can ban user"
  7. ]
  8. def show_privileges(self, first_name, last_name):
  9. print(f"{first_name} {last_name} 的权限有:")
  10. for privilege in self.privileges:
  11. print(f"- {privilege}")
  12. class User:
  13. def __init__(self, first_name, last_name):
  14. self.first_name = first_name
  15. self.last_name = last_name
  16. def describe_user(self):
  17. print(f"{self.first_name} {self.last_name}")
  18. def greet_user(self):
  19. print(f"Hello, {self.first_name} {self.last_name}!")
  20. class Admin(User):
  21. def __init__(self, first_name, last_name):
  22. super().__init__(first_name, last_name)
  23. self.privileges = Privileges()
  24. def show_privileges(self):
  25. self.privileges.show_privileges(self.first_name, self.last_name)
  26. admin = Admin("管理员", "张三")
  27. admin.describe_user()
  28. admin.greet_user()
  29. admin.show_privileges()
'
运行

习题9:电瓶升级

在书中有一份electric_car.py文件,我这里直接进行了修改,给Battery类添加一个名为upgrade_battery()的方法。该方法检查电瓶容量,如果不是100,就将其设置为100。创建一辆电瓶容量为默认值的电动汽车,调用方法get_range(),然后对电瓶进行升级,并再次调用get_range()。你将看到这辆汽车的续航里程增加了。

  1. class Car:
  2. def __init__(self, make, model, year):
  3. self.make = make
  4. self.model = model
  5. self.year = year
  6. self.odometer_reading = 0
  7. def get_descriptive_name(self):
  8. long_name = f"{self.year}{self.make}.{self.model}"
  9. return long_name.title()
  10. def read_odometer(self):
  11. print(f"This car has {self.odometer_reading} miles on it.")
  12. def update_odometer(self, mileage):
  13. if mileage >= self.odometer_reading:
  14. self.odometer_reading = mileage
  15. else:
  16. print("You can't roll back an odometer!")
  17. def increment_odometer(self, miles):
  18. self.odometer_reading += miles
  19. class Battery:
  20. def __init__(self, battery_size=75):
  21. self.battery_size = battery_size
  22. def describe_battery(self):
  23. print(f"This car has a {self.battery_size}-kWh battery.")
  24. def get_range(self):
  25. if self.battery_size == 75:
  26. range = 260
  27. elif self.battery_size == 100:
  28. range = 315
  29. print(f"This car can go about {range} miles on a full charge.")
  30. def upgrade_battery(self):
  31. if self.battery_size != 100:
  32. self.battery_size = 100
  33. class ElectricCar(Car):
  34. def __init__(self, make, model, year):
  35. super().__init__(make, model, year)
  36. self.battery = Battery()
  37. def describe_battery(self):
  38. print(f"This car has a {self.battery_size}-kWh battery.")
  39. def fill_gas_tank(self):
  40. print("This car doesn't need a gas tank!")
  41. my_tesla = ElectricCar('tesla', 'model s', 2019)
  42. print(my_tesla.get_descriptive_name())
  43. # 调用方法get_range()
  44. my_tesla.battery.get_range()
  45. # 对电瓶进行升级
  46. my_tesla.battery.upgrade_battery()
  47. print(my_tesla.battery.describe_battery())
  48. # 再次调用get_range()
  49. my_tesla.battery.get_range()
'
运行
4.导入标准库模块

Python标准库包含了许多有用的模块,这些模块中定义了许多类,可以使用import语句来导入这些模块,并使用其中的类。

习题10:骰子 

创建一个Die类,它包含一个名为sides的属性,该属性的默认值为6。编写一个名为roll_die()的方法,它打印位于1和骰子面数之间的随机数。创建一个6面的骰子再掷10次。 创建一个10面的骰子和一个20面的骰子,再分别掷10次。

  1. from random import randint
  2. class Die:
  3. # 按题目要求,建一个Die类,里面有一个默认值为6的sides属性,还有一个roll_die()方法用来摇骰子
  4. def __init__(self, sides=6):
  5. self.sides = sides
  6. def roll_die(self):
  7. roll = randint(1, self.sides)
  8. print(f"Rolling is: {roll}")
  9. return roll
  10. die = Die()
  11. die.roll_die()
'
运行

习题11:彩票

  创建一个列表或元组,其中包含10个数和5个字母。从这个列表或元组中随机选择4个数或字母,并打印一条消息,指出只要彩票上是这4个数或字母,就中大奖了。 

  1. import random
  2. GGboy = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'A', 'B', 'C', 'D', 'E']
  3. winning_numbers = random.sample(GGboy, 4)
  4. print(f"彩票号码是 {winning_numbers}。只要彩票上是这4个数或字母就中大奖.")
'
运行

习题12:彩票分析

  使用一个循环来明白前述彩票大奖有多难中奖。为此,创建一个名为my_ticket的列表或元组,再编写一个循环,不断地随机选择数或字母,直到中大奖为止。请打印一条消息,报告执行循环多少次才中了大奖。 

  1. import random
  2. # 中奖号码和数字字母池、初始化计数器
  3. my_ticket = [1, 2, "a", "c"]
  4. GGboy = [1, 2, 3, 'a', 'b', 'c', 'd']
  5. attempts = 0
  6. while True:
  7. attempts += 1
  8. selected_numbers = random.sample(GGboy, 4)
  9. if all(item in my_ticket for item in selected_numbers):
  10. print(f"执行了{attempts}次循环后中大奖,中奖号码是 {selected_numbers}。")
  11. break
'
运行
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号