property属性
说明
property属性就是负责把类中的一个方法当做属性进行使用这样做可以简化代码使用。
property属性装饰器定义方式
class Person(object):
def __init__(self):
self.__age = 0
# 获取属性
@property
def age(self):
return self.__age
# 修改属性
@age.setter
def age(self, new_age):
self.__age = new_age
# 原始调用方式
# p = Person()
# age = p.age()
# print(age)
p = Person()
print(p.age)
# 修改属性
p.age = 100
print(p.age)
@property
表示把方法当做属性使用, 表示当获取属性时会执行下面修饰的方法(修饰取值方法)@方法名.setter
表示把方法当做属性使用,表示当设置属性时会执行下面修饰的方法(修饰设值方法)- 装饰器方式的
property
属性修饰的方法名一定要一样
property属性类属性定义方式
定义property
属性
类属性 = property(获取值方法, 设置值方法)
使用
对象.类属性
对象.类属性=值
例子
class Person(object):
def __init__(self):
self.__age = 0
def get_age(self):
"""当获取age属性时会使用该方法"""
return self.__age
def set_age(self, new_age):
"""当设置属性时会使用该方法"""
if new_age >= 150:
print("年龄错误")
else:
self.__age = new_age
# 定义property属性
age = property(get_age, set_age)
p = Person()
print(p.age)
# 设置属性
p.age = 100
print(p.age)
with语句和上下文管理器
with语句使用
简化try...except...finlally
的处理流程,让读写文件变得更加简洁安全
语法
with expression [as target]:
with_body
# 即使出现异常也系统也会自动关闭流,不再需要手动关闭文件
with open("1.txt", "r") as f:
file_data = f.read()
print(file_data)
上下文管理器定义
一个类只要实现了__enter__()
和__exit__()
这个两个方法,这个类就是上下文管理器,通过这个类创建的对象就是上下文管理器对象。
__enter__
上文方法,需要返回一个操作文件对象
__exit__
下文方法,with
语句执行完成会自动执行,即使出现异常也会执行该方法
# 1定义一个File类
class File(object):
def __init__(self, file_name, file_model):
self.file_name = file_name
self.file_model = file_model
# 2实现 __enter__() 和 __exit__()方法
def __enter__(self):
"""上文方法"""
print("这是上文")
self.file = open(self.file_name, self.file_model)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
"""下文方法"""
print("这是下文")
self.file.close()
# 3然后使用 with 语句来完成操作文件
with File("1.txt","r") as f:
file_data = f.read()
print(file_data)
生成器
指定循环生成数据的规则,当条件不成立生成数据结束。数据不是一次性全部生成,而是使用一个在生成一个,可以节省内存的使用。
特点
- 惰性机制
- 只能向前
- 节省内存
生成器推导式
my_generator = (i * 2 for i in range(5))
,生成器推导式与列表推导式类型,中不过生成器推导式使用的是小括号,列表推导式使用的是列表[i * 2 for i in range(5)]
my_generator = (i * 2 for i in range(5))
# 使用next()函数获取生成器中下一个值
print(next(my_generator ))
# 循环遍历生成器
for i in my_generator:
print(i)
yield关键字
只要在函数中使用yield
关键字,这个函数就是生成器。yield
类似return
,中不过会再次从yield
位置开始执行
def generater(num):
for i in range(num):
print("开始")
yield i # 暂停并返回i值
print("生成完成")
说明:
- 代码执行到
yield
会暂停,并返回结果,下次启动生成器会从暂停位置继续向下执行 - 生成器把数据全部生成完成,在向下执行会抛出
StopIteration
异常 while
循环需要手动处理异常for
循环内部自动回处理异常
def generater(num):
for i in range(num):
print("开始")
yield i
print("生成完成")
g = generater(5)
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# 不产生异常的遍历全部数据
for i in g:
print(i)
执行结果:
超过总体数量时会抛出异常
斐波那契数列
# 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
def fb(num):
a = 0
b = 1
# 记录生成了几个数字
index = 0
while index < num:
result = a
#1 1 1 1
#1 2 1 2
#2 3 2 3
a, b = b, a+b
# 执行到yield暂停,并返回result结果。下次启动生成器会在暂停位置继续向下执行
yield result
index += 1
f = fb(5)
# print(next(f))
# print(next(f))
for i in f:
print(i)