小言_互联网的博客

Python基础(七) 类

570人阅读  评论(0)


本人是个新手,写下博客用于自我复习、自我总结。
如有错误之处,请各位大佬指出。
参考教材:Python编程从入门到实践


1.创建和使用类

1.1创建Dog类

根据Dog类创建的每个实例都将存储名字和年龄。我们赋予了每条小狗蹲下sit()和打滚roll_over()的能力。

如下:

class Dog():
	def __init__(self,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中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。

①方法__init__()

类中的函数称为方法,前面学到的有关函数的一切都适用于方法。就目前而言,唯一重要的差别是调用方法的方式。这个方法是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。这个方法中,我们定义了三个形参:self,name,age。其中的形参self必不可少,还必须位于其他形参的前面。为何必须要包含形参self呢?因为Python调用这个方法时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。我们创建Dog实例时,Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参name,age提供值。

1.2根据类创建实例

class Dog():
	def __init__(self,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.name
②调用方法:my_dog.sit()

2.使用类和实例

2.1Car类

例:

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.read_odometer()

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法__init__()内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参。

2.3修改属性的值

①直接修改

如:

my_new_car.odometer_reading=23

②方法修改

如:

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.")
	def update_odometer(self,mileage):
		if mileage>=self.odometer_reading:
			self.odometer_reading=mileage
		else:
			print("You can't roll back an odometer")

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()

③通过方法对属性的值进行递增

例:

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.")
	def update_odometer(self,mileage):
		if mileage>=self.odometer_reading:
			self.odometer_reading=mileage
		else:
			print("You can't roll back an odometer")
	def increment_odometer(self,miles):
		self.odometer_reading+=miles

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()
my_new_car.increment_odometer(10)
my_new_car.read_odometer()

3.继承

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

3.1子类的方法 init()

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

例如:

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())

3.3给子类定义属性和方法

让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。

例如:

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()

3.4可以重写父类的方法,只要方法同名就可以。

3.5将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。这样可以将大型类拆分成多个协同工作的小类。

例如:

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.")
	def get_range(self):
		if self.battery_size==70:
			range=240
		elif self.battery_size==85:
			range=270
		message="This car can go approximately "+str(range)
		message+=" miles on a full change."
		print(message)

class ElectricCar(Car):
	def __init__(self,make,model,year):
		super().__init__(make,model,year)
		self.battery=Battery()

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

4.导入类

随着你不断地给类添加功能,文件可能变得很长,即便你妥善地使用了继承亦如此。为遵循Python的总体理念,应让文件尽可能整洁。为在这方面提供帮助,Python允许你将类存储在模块中,然后在主程序中导入所需的模块。

4.1导入单个类

from 文件名 import 类名
如:from car import Car

这样我们就可以使用Car类了。就像它是在这个文件中定义的一样。

导入类是一种有效的编程方式。如果整个程序中包含了整个Car类,会很长。这样将类移到一个模块中,并导入该模块,你依然可以使用其所有功能,但主程序文件就会变得整洁而易于阅读。这还能让你将大部分逻辑存储在独立的文件中;确定类像你希望的那样工作后,你就可以不管这些文件,而专注于主程序的高级逻辑了。

4.2在一个模块中存储多个类

虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。

4.3从一个模块中导入多个类

可根据需要在程序文件中导入任意数量的类。

如:from car import Car,ElectricCar

4.4导入整个模块

你还可以导入整个模块,再使用句点表示法访问需要的类。

如:import car

4.5导入模块中的所有类

如:from car import *

但并不推荐使用这种导入方式。首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类,这将大有裨益;但这种导入方式没有明确地指出你使用了模块中的哪些类。这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其他东西同名的类,将引发难以诊断的错误。

所以需要从一个模块中导入很多类的时候,还不如导入整个模块,如4.4。并使用module_name.class_name这种语法来访问类。这样做时,虽然文件开头也没有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。

4.6在一个模块中导入另一个模块

有时候,需要将类分散到多个模块中,以免模块太大,或者在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。

在这种情况下,可在前一个模块中导入必要的类。

5.Python标准库

Python标准库是一组模块,安装的Python都包含它。这个模块是其他程序员编写好的。

可使用标准库中的任何函数和类,为此只需在程序开头包含一条简单import语句。
比如模块collections中的一个类——OrderedDict。
字典让你能够将信息关联起来,但它们不记录你添加键值对的顺序。要创建字典并记录其中的键值对的添加顺序,可使用模块collections中的OrderedDict类。

这个实例的行为几乎与字典相同,区别只在于记录了键值对的添加顺序。


转载:https://blog.csdn.net/qq_45613931/article/details/101380167
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场