代码部分已经有很详细的注释了,基本上零基础的多可以看懂,所以这里就不多说了,直接上代码了。有错误或者不足的地方,欢迎下方留言。
类的定义:
类在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()
运行结果