property属性就是负责把一个方法当做属性进行使用 这样可以简化代码使用
定义property属性的两种方式 装饰器方式类属性方式#1.装饰器 class Student(object): def __init__(self): #是由属性 self.__age 10 property #对象调用age属性时会执行下面的方法 def age(self): print( 获取属性啦 ) return self.__age #设置属性 方法名与获取属性方法名一致 age.setter #当对象调用age属性设置值的时候回调用下面的方法 def age(self,new_age): print( 设置属性了 ) if new_age 0 and new_age 120: self.__age new_age else: print( 成精啦! ) #实例化对象 st Student() # age st.age() # print(age)# 10 #使用property age st.age print(age)# 获取属性啦 10 #设置属性值 st.age 23 age st.age print(age)# 设置属性了 获取属性啦 23
# 2.类属性 class Student1(object): def __init__(self): self.__age 10 def get_age(self): print( 获取属性的方法 ) return self.__age def set_age(self,new_age): print( 设置属性的方法 ) if new_age 0 and new_age 120: self.__age new_age else: print( 成精了 ) #get_age 获取属性时执行的方法 set_age设置属性时用的方法 age property(get_age,set_age) st1 Student1() age st1.age print(age)# 获取属性的方法 10 #设置属性 st1.age 34 age st1.age print(age)# 设置属性的方法 获取属性的方法 342.with语句的使用
文件使用完后必须关闭 因为文件对象会占用操作系统的资源 且操作系统同一时间能打开的文件数量也是有限的
由于文件读写有可能出现IOEror 一旦出现 后面的f.close()就不会调用
为了保证无论是出错都能正确关闭文件 可以使用rty…finally来解决
此种方法虽然运行良好 但代码过于繁琐 并需添加try-except-finallly 语句 不是很方便 也容易忘记
因此 python提供了一种with语句 既简单又安全 且with语句执行完成后会自动调用关闭文件操作 出现异常也会自动调用关闭文件
一个类只要实现了__enter__()和__exit__()这两个方法 通过该类创建的对象我们就称为上下文管理器
上下文管理器可以使用with语句 with语句之所以这么强大 背后就是由上下文管理器做支撑 也就是说 使用的open函数创建的文件就是一个上下文管理器对象
32.上下文管理器 #在类里面实现__enter__和__exit__方法 #自定义上下文管理器类 class File(object): def __init__(self,file_name,file_mode,encoding): self.file_name file_name self.file_mode file_mode self.encoding encoding def __enter__(self): #上文方法 负责返回操作对象资源 比如 文件对象 数据库连接对象 self.file open(self.file_name,self.file_mode,encoding self.encoding) return self.file def __exit__(self,exc_type,exc_val,exc_tb): #下文方法 负责释放对象资源 如 关闭文件 关闭数据库 print( over ) self.file.close() #with语句结合上下文管理器对象使用 with File( a.txt , r ,encoding utf-8 )as f: f_data f.read() print(f_data)# python,人生苦短 我用python over第二种方法
假如想让一个函数成为上下文管理器 python还提供了一个像contextmanager的装饰器,更进一步简化了上下文管理器的实现方式 通过yield将函数分割成两部分 yield上面的语句在__enter__方法中执行 yield下面的语句在__exit__方法中执行 紧跟yield后面的参数是函数的返回值
#使用装饰器实现上下文管理器 from contextlib import contextmanager #将普通函数装饰成上下文管理器 contextmanager def my_open(file_name,file_mode): try: #返回操作对象 file open(file_name,file_mode,encoding utf-8 ) #yield关键字之前的代码可认为是上文方法 负责返回操作对象资源 yield file except Exception as e: print(e) finally: #yield关键字后是下文 【负责释放对象操作资源 print( over ) file.close() #普通函数不呢个结合with语句使用 with语句结合上下文管理器 #此方法 异常时不能关闭 # with my_open( a.txt , r )as f: # f_data f.read() # print(f_data)# python,人生苦短 我用python over with my_open( a.txt , r )as f: f.write( dfd )# not writable over



