python基础知识(三)

代码部分已经有很详细的注释了,基本上零基础的多可以看懂,所以这里就不多说了,直接上代码了。有错误或者不足的地方,欢迎下方留言。

类的定义:

类在python中可以说是很重要的一块了。面向对象编程是最有效的软件编写方法之一,在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。

# -*- coding: utf-8 -*-
#定义一个类,类名称首字母要大写
class Dog():
	#_init_是一个特殊的方法,每当Dog类创建实例时,都会被调用
	#与类相关联的方法调用都会自动传递一个实参self,他是一个指向实例本身的引用
	#让实例能够访问类中的属性和方法	
	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.name.title())
print(my_dog.age)

#调用类的方法
my_dog.sit()
my_dog.roll_over()

#创建多个实例
your_dog = Dog('lucy', 9)
#访问类属性
print(your_dog.name.title())
print(your_dog.age)

#调用类的方法
your_dog.sit()
your_dog.roll_over()

运行结果:

属性值和继承的使用:

# -*- coding: utf-8 -*-
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):
		self.odometer_reading = mileage
	
	#通过方法对属性的值进行递增
	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.read_odometer()

#修改属性值
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

#通过方法修改属性值
my_new_car.update_odometer(24)
my_new_car.read_odometer()

#通过方法对属性的值进行递增
my_new_car.increment_odometer(10)
my_new_car.read_odometer()

#将实例作为一个属性使用,先定一个类
class Battery():
	def __init__(self, battery_size=70):
		self.battery_size = battery_size
	def describe(self):
		print("This car has a "+str(self.battery_size)+"-kwh battery.")

print("继承")
#ElectricCar(Car)继承car类,继承之后可以调用car类中的所有属性和方法
class ElectricCar(Car):
	def __init__(self, make, model, year):
		"""
		初始化父类的属性,在初始化之类特有的属性
		"""
		super().__init__(make, model, year)
		self.battery_size =  70
		
		#将实例用作属性
		self.battery = Battery()
		
	def describe_battery(self):
		print("this car has a "+str(self.battery_size)+"-kwh battery.")
		
	#重写父类方法,重写后实例子类,调用此方法,则调用子类中写的方法
	def read_odometer(self):
		print("重写父类方法")
	
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

#将实例用作属性
my_tesla.battery.describe()

运行结果:

 

导入类及继承小案例

先新建了一个表示燃油汽车和电动汽车的类car.py(一个模块中存储多个类):

"""一个可用于表示燃油汽车和电动汽车的类"""
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
		
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 charge."
		print(message)

#继承Car类
class ElectricCar(Car):
	"""模拟电动车的独特之处"""
	def __init__(self, make, model, year):
		"""
		初始化父类的属性,再初始化电动车特有的属性
		"""
		super().__init__(make, model, year)
		self.battery = Battery()
		

导入类(和导入模块差不多) from 文件名 import 导入的类名

#导入类 from 文件名 import 导入的类名
from car import Car
#从一个模块中导入多个类
#from car import Car, ElectricCar
#导入整个模块
#import car
#导入模块中的所有类
#from car import *

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_electric_car.py导入ElectricCar类:

#导入ElectricCar类
from car import ElectricCar

my_tesla = ElectricCar('tesla', 'model s', 2016)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

运行结果:

文件操作——读取文件

文件操作在平时是很常用的,比如一些天气数据,交通数据,社会经济数据等都可以存储到文件中,一便下次运行数据还在,可以直接使用。

读取文件部分:

首先创建一个读取的文件Demo.txt和读取的py文件放在一个目录中

#文件操作读取
#函数open()接收一个参数,要打开的文件名称
#with访问文件打开后将自动关闭,不用close()关闭
#文件路径,在同一目录里在放一个文件夹text_files的话:with open('text_files\Demo.txt')
#在系统中的话:with open('c:\users\Demo.txt')
with open('Demo.txt') as file_object:
	#read()读取这个文件的全部内容
	contents = file_object.read()
	#如何字符串尾部有多余的空格则用rstrip()方法删除
	print(contents.rstrip())

#逐行读取
print('逐行读取')
with open('Demo.txt') as file_object:
	for line in file_object:
		print(line)

with open('Demo.txt') as file_object:
	#readlines()从文件中读取一行,并将其存储在一个列表中
	lines = file_object.readlines()
#遍历列表
for line in lines:
	print(line.rstrip())

运行结果:

写入文件:

#文件操作,写入文件
#open()提供了两个参数,第一个是要打开的文件的名称
#第二个'w'是告诉python,是要以写入的模式打开文件
#打开文件时,可指定读取模式'r',写入模式'w',附加模式'a'或同时满足读取和写入文件的模式'r+',省略模式参数,默认是只读模式
with open('Demo01.txt', 'w') as file_object:
	#write()向文件中写入内容
	file_object.write('I love programming.')
#写入多行
with open('Demo01.txt', 'w') as file_object:
	#write()函数不会在你写入的文本末尾添加换行符
	#所以如果想写入多行,则需要在语句中包含换行符
	file_object.write('aaaa\n')
	file_object.write('bbbb\n')
#附加到文件
with open('Demo01.txt', 'a') as file_object:
	#之前写的文件都是覆盖之前的文件,如果想在原有的文件后面追加则可以用附加模式
	file_object.write('cccc\n')
	file_object.write('dddd\n')

异常处理,我们在写程序时,很容易遇到一些不正常数据之后运行报错,这时我们可以用异常去捕获,之后给出一个友好的提示。

#ZeroDivisionError异常,当try里边的代码块运行有问题时就会引发ZeroDivisionError中的代码
try:
	print(5/0)
except ZeroDivisionError:
	print("You can't divide by zero1")

#FileNotFoundError异常,文件异常
try:
	#打开一个不存在的文件
	with open('aaa.txt') as f_obj:
		print(f_obj.read())
except FileNotFoundError:
	print('sorry, file does not exist')
    #python异常中有一个pass语句,就是报异常之后什么都不用作
    #pass

运行结果:

split()方法,以空格为分隔符将字符串拆分成多个部分,之后存储到一个列表中

#split()以空格为分隔符拆分成多个部分,将这些部分存储到一个列表中
title = 'alice in wonderland'
print(title.split())

运行结果:

JSON存储数据

json.dump()函数存储列表,json.load()读取列表中的内容

#先导入json模块,在创建一个数字列表
import json
numbers = [2, 3, 4, 5, 6, 7]
with open('numbers.json', 'w') as f_obj:
	#使用函数json.dump()将数字列表写入numbers.json中
	json.dump(numbers, f_obj)

with open('numbers.json') as f_obj:
	#json.load加载存储在numbers.json中的信息
	numbers = json.load(f_obj)
print(numbers)

运行结果和文件里边存储的结果一样:

异常和文件操作及函数调用的小案例

运行先检查是否有json文件,
如果有则读取出他的姓名,姓名不为空,就显示,为空就让他输入姓名在保存,显示出来
如果没有则创建文件,让他输入姓名之后保存,显示

#异常和文件操作及函数调用的小案例
#运行先检查是否有json文件,
#如果有则读取出他的姓名,姓名不为空,就显示,为空就让他输入姓名在保存,显示出来
#如果没有则创建文件,让他输入姓名之后保存,显示
import json

def get_stored_username():
	"""如果存储了用户名,就获取他"""
	try:
		with open('username.json') as f_obj:
			username = json.load(f_obj)
	except FileNotFoundError:
		return None
	else:
		return username
		
def get_new_username():
	"""提示用户输入用户名"""
	username = input("请输入姓名:")
	filename = 'username.json'
	with open(filename, 'w') as f_obj:
		json.dump(username, f_obj)
	return username

def greet_user():
	"""问候用户,并指出其名字"""
	username = get_stored_username()
	if username:
		print("welcome back, "+username+"!")
	else:
		username = get_new_username()
		print("we'll remember you when you come back, "+username+"!")
greet_user()

运行结果

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值