[python从入门到实践] chap9类

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()。你会看到这辆汽车的续航里程增加了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值