1创建和使用类
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() + "rell over!")
类中的函数称为方法
__ init __()是一个特殊的方法,每当你根据Dog类创建新实 例时,Python都会自动运行它。
Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法 调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。 我们创建Dog实例时,Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和 17 年龄;self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最 后两个形参(name和age)提供值。
可通过实例访问的变量称为属性。
创建实例
my_dog = Dog('willie', 6)
访问属性
my_dog.name
调用方法
my_dog.sit()
给属性指定默认值
class Car():
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
直接修改属性的值
my_new_car.odometer_reading = 23
通过方法对属性的值进行递增
def increment_odometer(self, miles):
"""将里程表读数增加指定的量"""
self.odometer_reading += miles`在这里插入代码片`
2继承
创建子类时,父类必须包含在当前文件中,且位于子类前面。
class ElectricCar(Car): #定义子类时,必须在括号内指定父类的名称。
"""电动汽车的独特之处"""
def __init__(self, make, model, year): #方法__init__() 接受创建Car实例所需的信息
"""初始化父类的属性"""
super().__init__(make, model, year) #处的super()是一个特殊函数,帮助Python将父类和子类关联起来。
如果一个属性或方法是任何汽车都有的,而不是电动汽车特有 的,就应将其加入到Car类而不是ElectricCar类中。这样,使用Car类的人将获得相应的功能,而 ElectricCar类只包含处理电动汽车特有属性和行为的代码。
重写父类
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子 类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方 法,而只关注你在子类中定义的相应方法。
大类拆分成小类
class Battery():
"""一次模拟电动汽车电瓶的简单尝试"""
def __init__(self, battery_size=70):
"""初始化电瓶的属性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kWh battery."
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
""" 初始化父类的属性,再初始化电动汽车特有的属性 """
super().__init__(make, model, year)
self.battery = Battery() #添加了一个名为self.battery的属性
3导入类
from car import Car #导入单个类
my_new_car = Car('audi', 'a4', 2016)
from car import Car, ElectricCar #导入多个
import car #导入整个模块
my_beetle = car.Car('volkswagen', 'beetle', 2016)
4标准库
可使用标准库中的任何函数和类,为此只需在程序开头包含一条简单的import语句。
from collections import OrderedDict
模块http://pymotw.com/
5编码风格
类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名 和模块名都采用小写格式,并在单词之间加上下划线。
对于每个类,都应紧跟在类定义后面包含一个文档字符串。
9-4 就餐人数:
在为完成练习 9-1 而编写的程序中,添加一个名为 number_served 的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例;打印有 多少人在这家餐馆就餐过,然后修改这个值并再次打印它。添加一个名为 set_number_served()的方法,它让你能够设置就餐人数。调用这个 方法并向它传递一个值,然后再次打印这个值。添加一个名为 increment_number_served()的方法,它让你能够将就餐人数递增。 调用这个方法并向它传递一个这样的值:你认为这家餐馆每天可能接待的就餐人数。
9-5 尝试登录次数:
在为完成练习 9-3 而编写的 User 类中,添加一个名为 login_attempts 的属性。编写一个名为 increment_login_attempts()的方法,它将属性 login_attempts 的值加 1。再编写一个名为reset_login_attempts()的方法,它将属性 login_attempts 的值重置为 0。根据User类创建一个实例,再调用方法increment_login_attempts()多次。打印属 8性 login_attempts 的值,确认它被正确地递增;然后,调用方法 reset_login_attempts(), 并再次打印属性 login_attempts 的值,确认它被重置为 0。
9-6 冰淇淋小店:
冰淇淋小店是一种特殊的餐馆。编写一个名为 IceCreamStand 的 类,让它继承你为完成练习 9-1 或练习 9-4 而编写的 Restaurant 类。这两个版本的 Restaurant 类都可以,挑选你更喜欢的那个即可。添加一个名为 flavors 的属性,用于 存储一个由各种口味的冰淇淋组成的列表。编写一个显示这些冰淇淋的方法。创建一个 IceCreamStand 实例,并调用这个方法。
9-7 管理员:
管理员是一种特殊的用户。编写一个名为 Admin 的类,让它继承你为 完成练习 9-3 或练习 9-5 而编写的 User 类。添加一个名为 privileges 的属性,用于存 储一个由字符串(如"can add post"、“can delete post”、"can ban user"等)组成的 8 列表。编写一个名为 show_privileges()的方法,它显示管理员的权限。创建一个 Admin 实例,并调用这个方法。
9-8 权限:
编写一个名为 Privileges 的类,它只有一个属性——privileges,其中 存储了练习 9-7 所说的字符串列表。将方法 show_privileges()移到这个类中。在 Admin 类中,将一个 Privileges 实例用作其属性。创建一个 Admin 实例,并使用方法 show_privileges()来显示其权限。
9-9 电瓶升级:
在本节最后一个 electric_car.py 版本中,给 Battery 类添加一个名为 upgrade_battery()的方法。这个方法检查电瓶容量,如果它不是 85,就将它设置为 85。 创建一辆电瓶容量为默认值的电动汽车,调用方法 get_range(),然后对电瓶进行升级, 13 并再次调用 get_range()。你会看到这辆汽车的续航里程增加了。