您的位置:首页 > 编程语言 > Python开发

《python编程从入门到实践》总结及课后答案-第9章 类

2019-08-19 11:12 429 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/xinglingdi/article/details/99453795

我感觉类是python中比较难运用的一块,但能够学会学懂也将非常的方便。

  • 创建和使用类

使用类几乎可以模拟任何东西。例如创建一个Dog类

[code]"""一次模拟小狗的简单尝试"""
class Dog():
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age

def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")

def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")

根据约定,在 Python 中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。

1.  方法 __init__()

类中的函数称为方法; __init__() 是一个特殊的方法,每当你根据 Dog 类创建新实例时, Python 都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免 Python 默认方法与普通方法发生名称冲突。在这个方法的定义中,形参 self 必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参 self 呢?因为 Python 调用这个__init__() 方法来创建 Dog 实例时,将自动传入实参 self 。每个与类相关联的方法调用都自动传递实参 self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。(即在__init__()初始化后的值在其他方法中都适用)

以 self 为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。

在 Python 2.7 中创建类时,需要做细微的修改 —— 在括号内包含单词 object :

[code]class Dog(object):

2. 根据类创建实例

[code]my_dog = Dog('Lili', 6)

 3. 访问属性 和方法

[code]#访问属性
my_dog.name
my_dog.age

#访问方法
my_dog.sit()
my_dog.roll_over()

9-1  餐馆 :创建一个名为 Restaurant 的类,其方法 __init__() 设置两个属性: restaurant_name 和 cuisine_type 。创建一个名
为 describe_restaurant() 的方法和一个名为 open_restaurant() 的方法,其中前者打印前述两项信息,而后者打印一条消息,指出餐馆正在营业。 

9-2  三家餐馆 :根据你为完成练习 9-1 而编写的类创建三个实例,并对每个实例调用方法 describe_restaurant() 。

[code]class Restaurant():
"""建立一个关于餐厅的类"""
def __init__(self, restaurant_name, cuisine_type):
self.name = restaurant_name
self.type = cuisine_type

def describe_restaurant(self):
print("Our restaurant's name is " + self.name + ',')
print("Our restaurant's type is " + self.type + '.')

def open_restaurant(self):
print(self.name + " restaurant is now opening.")

restaurant1 = Restaurant('chuan cai guan', 'cook')
restaurant2 = Restaurant('have a good meal', 'fry')
restaurant3 = Reataurant('fish', 'hot pot')

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

[code]class User():
def __init__(self, first_name, last_name):
self.first = first_name
self.last = last_name

def describe_user(self):
name = self.last + " " + self.first
print("My name is " + name + ".")
return name

def greet_user(self):
name = describe_user()
print("Hello, " + name.title() + "!")

user1 = User('lingdi', 'xing')
user2 = User('gun', 'han')
user3 = User('grunt', 'wu')
  • 使用类和实例

 修改属性的值,可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。

  • 直接通过实例进行修改
[code]class Car():
def __init__(self, make, model, year):
""" 初始化描述汽车的属性 """
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0

def get_descriptive_name(self):
""" 返回整洁的描述性信息 """
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()

def read_odometer(self):
""" 打印一条指出汽车里程的消息 """
print("This car has " + str(self.odometer_reading) + " miles on it.")

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

 my_new_car.odometer_reading = 23使用实例加点直接修改了属性的值,并将该属性值设为23.

  •   通过方法修改属性的值

可以定义一个更新属性的方法

[code]class Car():
--snip--

def update_odometer(self, mileage):
""" 将里程表读数设置为指定的值 """
self.odometer_reading = mileage

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())

my_new_car.update_odometer(23)
my_new_car.read_odometer()
  •  通过方法对属性的值进行递增

 

[code]class Car():
--snip--

def update_odometer(self, mileage):
--snip--

def increment_odometer(self, miles):
""" 将里程表读数增加指定的量 """
self.odometer_reading += miles

my_used_car = Car('subaru', 'outback', 2013)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()

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

[code]class Restaurant():
"""建立一个关于餐厅的类"""
def __init__(self, restaurant_name, cuisine_type):
self.name = restaurant_name
self.type = cuisine_type
self.number_served = 0

def describe_restaurant(self):
print("Our restaurant's name is " + self.name + ',')
print("Our restaurant's type is " + self.type + '.')

def open_restaurant(self):
print(self.name + " restaurant is now opening.")

def set_number_served(self, numbs):
if numbs > self.number_served:
self.number_served = numbs
else:
print("The number is wrong!")

def increment_number_served(self, incr_numb):
self.number_served += incr_numb

def read_served(self):
print("We have served" + str(self.number_served) + " clients.")

restaurant1 = Restaurant('chuan cai guan', 'cook')
restaurant1.read_served()

restaurant1.number_served = 100
restaurant1.read_served()

restaurant1.set_number_served(200)
restaurant1.read_served()

restaurant1.increment_number_served(50)
restaurant1.read_served()

9-5  尝试登录次数 :在为完成练习 9-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 。 

[code]class User():
def __init__(self, first_name, last_name):
self.first = first_name
self.last = last_name
self.login_attempts = 1

def describe_user(self):
name = self.last + " " + self.first
print("My name is " + name + ".")
return name

def increment_login_attempts(self):
self.login_attempts += 1

def reset_login_attempts(self):
self.login_attempts = 0

def greet_user(self):
name = describe_user()
print("Hello, " + name.title() + "!")

user1 = User('lingdi', 'xing')
user1.increment_login_attempts()
user1.increment_login_attempts()
user1.increment_login_attempts()
print(user1.login_attempts)

user1.reset_login_attempts()
print(user1.login_attempts)
  • 类的继承 

如果你要编写的类是另一个现成类的特殊版本,可使用继承 。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类 ,而新类称为子类 。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

例如:对于上面的汽车car,现在需要描述电动汽车ElectricCar,它具有前面所描述car的所有属性。

[code]class Car():
def __init__(self, make, model, year):
""" 初始化描述汽车的属性 """
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0

def get_descriptive_name(self):
""" 返回整洁的描述性信息 """
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()

def read_odometer(self):
""" 打印一条指出汽车里程的消息 """
print("This car has " + str(self.odometer_reading) + " miles on it.")

class ElectricCar(Car):
""" 电动汽车的独特之处 """

def __init__(self, make, model, year):
""" 初始化子类的属性 """
super.__init__(make, model, year):
""" 继承父类的属性 """

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())

super() 是一个特殊函数,帮助 Python 将父类和子类关联起来。这行代码让 Python 调用 ElectricCar 的父类的方法 __init__() ,让 ElectricCar 实例包含父类的所有属性。父类也称为 超类 ( superclass ) 。

在 Python 2.7 中,继承语法稍有不同, ElectricCar 类的定义类似于下面这样:

[code]class Car(object):
def __init__(self, make, model, year):
--snip--

class ElectricCar(Car):
def __init__(self, make, model, year):
super(ElectricCar, self).__init__(make, model, year)
--snip--

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

[code]class Restaurant():
"""建立一个关于餐厅的类"""
def __init__(self, restaurant_name, cuisine_type):
self.name = restaurant_name
self.type = cuisine_type

def describe_restaurant(self):
print("Our restaurant's name is " + self.name + ',')
print("Our restaurant's type is " + self.type + '.')

def open_restaurant(self):
print(self.name + " restaurant is now opening.")

class IceCreamStand(Restaurant):

def __init__(self, restaurant_name, cuisine_type,flavors):
self.flavors = flavors
super().__init__(restaurant_name, cuisine_type)

def describe_flavors(self):
print("The flavors of ice cream are ")
for flover in self.flavors:
print("\n--" + flover)

flavors = ['caomei', 'mocha', 'niunai']
my_icecream = IceCreamStand('guming', 'IceCream',flavors)
my_icecream.describe_flavors()

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

[code]class User():
def __init__(self, first_name, last_name):
self.first = first_name
self.last = last_name
self.login_attempts = 1

def describe_user(self):
name = self.last + " " + self.first
print("My name is " + name + ".")
return name

def increment_login_attempts(self):
self.login_attempts += 1

def reset_login_attempts(self):
self.login_attempts = 0

def greet_user(self):
name = describe_user()
print("Hello, " + name.title() + "!")

class Admin(User):
def __init__(self,first_name, last_name, privileges):
self.privileges =  privileges
super().__init__(first_name, last_name):

def show_privileges(self):
print("The privileges are")
for privilege in self.privileges:
print("---" + privilege)

privileges = ["can add post", "can delete post","can ban user"]
admin0 = Admin("Lingdi", "Xing", privileges)
admin0.show_privileges()

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

[code]class User():
def __init__(self, first_name, last_name):
self.first = first_name
self.last = last_name
self.login_attempts = 1

def describe_user(self):
name = self.last + " " + self.first
print("My name is " + name + ".")
return name

def increment_login_attempts(self):
self.login_attempts += 1

def reset_login_attempts(self):
self.login_attempts = 0

def greet_user(self):
name = describe_user()
print("Hello, " + name.title() + "!")

class Privileges():
def __init__(self, privi):
self.privi = privi

def show_privileges(self):
print("The privileges are")
for privilege in self.privi:
print("---" + privilege)

class Admin(User):
def __init__(self,first_name, last_name):
self.privileges =  Privileges(privileges)
super().__init__(first_name, last_name)

privileges = ["can add post", "can delete post","can ban user"]
admin0 = Admin("Lingdi", "Xing")
admin0.privileges.show_privileges()

类也可以作为模块导入。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: