Python语法基础刻意练习:Task10(类和对象)

1.创建和使用类

使用类几乎可以模拟任何东西。下面来编写一个表示小狗的简单类Dog——它表示的不是特定的小狗,而是任何小狗。对于大多数宠物狗,它们都有名字和年龄;我们还知道,大多数小狗还会蹲下和打滚。由于大多数小狗都具备上述两项信息和两种行为,我们的Dog类将包含它们。这个类让python知道如何创建表示小狗的对象。编写这个类后,我们将使用它来创建表示特定小狗的实例。

  • 创建Dog类
    根据Dog类创建的每个实例都将存储名字和年龄。我们赋予了每条小狗蹲下和打滚的能力:
# -*- coding: GBK -*-
class Dog():
	"""a simple try to simulate a puppy"""
	def __init__(self,name,age):
		"""初始化属性name和age"""
		self.name=name
		self.age=age
	def sit(self):
		"""模拟小狗被命令时蹲下"""
		print(self.name.title()+" is not sitting.")
	def roll_over(self):
		"""模拟小狗被命令时打滚"""
		print(self.name.title()+" rolled over.")

首先,我们定义了一个名为Dog的类,由三个双引号括起来的为文档字符串,在函数部分已经解释过,它对这个类的功能做了描述。再来看类中的内容,首先我们定义了方法__init__(),类中的函数称为方法。init()是一个特殊的方法,每当你根据Dog类创建新实例时,python会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免python默认方法与普通方法发生名称冲突。
在__init__()定义中包含了三个形参:self、name和age。在此定义中,形参self必不可少,还必须位于其他形参的前面。因为python调用这个__init__()方法来创建实例时,将自动传入实参self。每个与类相关联的的方法调用都自动传递实参self,它是一个指向实例本身的引用让实例能够访问类中的属性和方法。
init()内的两个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name=name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。self.age=age类似。像这样可通过实例访问的变量称为属性。
定义的另外两个方法sit()和roll_over(),由于不需要额外的信息,所以只有一个形参self。

  • 根据类创建实例
    下面来创建一个表示特定小狗的实例:
# -*- coding: utf-8 -*-
class Dog():
	"""a simple try to simulate a puppy"""
	def __init__(self,name,age):
		"""初始化属性name和age"""
		self.name=name
		self.age=age
	def sit(self):
		"""模拟小狗被命令时蹲下"""
		print(self.name.title()+" is not sitting.")
	def roll_over(self):
		"""模拟小狗被命令时打滚"""
		print(self.name.title()+" rolled over.")
my_dog=Dog('willie',6)
print("my dog's name is "+my_dog.name.title()+'.')
print("my dog is "+str(my_dog.age)+' years old.')

#my dog's name is Willie.
#my dog is 6 years old.

(1)访问属性
要访问实例的属性,可使用句点表示法。例如,用my_dog.name访问属性name的值。
(2)调用方法
要调用方法,可指定实例的名称(这里是my_dog)和要调用的方法,并用句点分隔它们。

# -*- coding: utf-8 -*-
class Dog():
	"""a simple try to simulate a puppy"""
	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.")
my_dog=Dog('willie',6)
print("my dog's name is "+my_dog.name.title()+'.')
print("my dog is "+str(my_dog.age)+' years old.')
my_dog.sit()
my_dog.roll_over()

#my dog's name is Willie.
#my dog is 6 years old.
#Willie is now sitting.
#Willie rolled over.

(3)创建多个实例

# -*- coding: utf-8 -*-
class Dog():
	"""a simple try to simulate a puppy"""
	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.")
my_dog=Dog('willie',6)
your_dog=Dog('lucy',3)
print("my dog's name is "+my_dog.name.title()+'.')
print("my dog is "+str(my_dog.age)+' years old.')
my_dog.sit()

print("\nyour dog's name is "+your_dog.name.title()+'.')
print("your dog is "+str(your_dog.age)+' years old.')
your_dog.sit()


#my dog's name is Willie.
#my dog is 6 years old.
#Willie is now sitting.

#your dog's name is Lucy.
#your dog is 3 years old.
#Lucy is now sitting.

2.使用类和实例

Car类
下面来编写一个表示汽车的类:

# -*- coding: utf-8 -*-
class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self,make,model,year):
		"""初始化属性name和age"""
		self.make=make
		self.model=model
		self.year=year
	def get_descriptive_name(self):
		"""返回整洁的描述性信息"""
		long_name=str(self.year)+' '+self.make+' '+self.model
		return long_name.title()
my_new_car=Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())

#2016 Audi A4

给属性指定默认值

# -*- coding: utf-8 -*-
class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self,make,model,year):
		"""初始化属性name和age"""
		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.read_odometer()
#2016 Audi A4
#this car has 0 miles on it.

我们添加了一个名为odometer_reading的属性,其初始值总是0。还添加了一个名为read_odometer()的方法,用于读取汽车的里程表。

修改属性的值

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()
#2016 Audi A4
#this car has 23 miles on it.

我们使用句点表示法来直接访问并修改属性odometer_reading的值,也可以通过方法修改属性的值:

# -*- coding: utf-8 -*-
class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self,make,model,year):
		"""初始化属性name和age"""
		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.')
	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()
#2016 Audi A4
#this car has 23 miles on it.
3.继承

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

子类的方法__init__()
创建子类的实例时,python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__()需要父类施以援手:

# -*- coding: utf-8 -*-
class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self,make,model,year):
		"""初始化属性name和age"""
		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.')
	def update_odometer(self,mileage):
		"""将里程表读数设置为指定的值"""
		self.odometer_reading=mileage
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())

#2016 Tesla Model S

创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称。方法__init__()接受创建实例所需的信息。super()是一个特殊函数,帮助python将父类和子类关联起来。这行代码让python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称超类,名称super因此而得名。

给子类定义属性和方法

# -*- coding: utf-8 -*-
class Car():
	"""一次模拟汽车的简单尝试"""
	def __init__(self,make,model,year):
		"""初始化属性name和age"""
		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.')
	def update_odometer(self,mileage):
		"""将里程表读数设置为指定的值"""
		self.odometer_reading=mileage
class ElectricCar(Car):
	"""电动汽车的独特之处,并初始化电动汽车的特有属性"""
	def __init__(self,make,model,year):
		super().__init__(make,model,year)
		self.battery_size=70
	def describe_battery(self):
		"""打印一条描述电瓶容量的信息"""
		print('this car has a '+str(self.battery_size)+'-kwh battery.')
my_tesla=ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
#2016 Tesla Model S
#this car has a 70-kwh battery.

我们在ElectricCar类中添加了新属性self.battery_size,并设置了初始值,而Car类中不包含它。还添加了一个名为describe_battery()的方法。

重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它要与重写的父类方法同名。这样,python就不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

4.导入类

导入单个类
将Car类存储在一个名为car.py的文件,导入此模块中的Car类。

from car import Car

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

#2016 Audi A4 

在一个模块中存储多个类
将类ElectricCar也添加到模块中,即可在另一个文件中导入类ElectricCar:

from car import ElectricCar

从一个模块中导入多个类

from car import Car,ElectricCar

导入整个模块

import car

导入模块中的所有类

from car import *
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值