property属性
作用
property的作用就是把类的方法当做属性来调用,是简化代码的一种方式。下面我们来一起瞧一瞧。
第一种方式:装饰器方式
- 在类的方法前加上@property即可像使用属性那样调用标记方法
- 定义一个与刚才@property同名的方法,并且标记方法名.setter,即可通过赋值方式传参
- 定义一个与刚才@property同名的方法,并且标记方法名.deleter,即可通过del 方法名执行相关操作
是不是很懵逼?来上代码!
class Wife(object):
def __init__(self):
self.__age = 18
@property
def age(self):
return self.__age
@age.setter
def age(self, real_age):
self.__age = real_age
@age.deleter
def age(self):
del self.__age
# 获取属性
w = Wife()
print(w.age)
# 给属性赋值
w.age = 10
print(w.age)
# 删除属性
del w.age
执行结果如下:
18
10
类属性方式
类属性的方式很简单,就是使用property方法,该方法有两个参数传递两个方法,一个方法是用来获取值,另一个对应的是设置值。来上代码,一看就懂。
class Wife(object):
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
def set_age(self, real_age):
self.__age = real_age
age = property(get_age, set_age)
# 获取属性
w = Wife()
print(w.age)
# 给属性赋值
w.age = 10
print(w.age)
执行结果与上面的一样。
With语句
特点
with的特点是既简单又安全,使用之前学过的文件操作来举个例子,正常文件的可能操作如下:
# 打开文件
f = open("C:/Users/huangkun/Desktop/2.txt", "r")
# 读取内容
print(f.readline())
# 关闭文件流
f.close()
这样的方式不仅复杂,并且读取出错的话可能会抛出异常,使用with如下:
with open("C:/Users/huangkun/Desktop/2.txt", "r") as f:
print(f.readline())
从代码能看出with语句使用方式更加简洁,同时代码执行完毕或者出现异常with会自动关闭文件流,是不是既安全又简洁呐。那么with语句为什么这么强大呢?它的主要是来源于上下文管理器。
问题来了,啥是上下文管理器?
上下文管理器
定义
一个类如果实现了__enter__()方法与__exit__()方法,那么这个类的对象实例就可以被称为上下文管理器。
- __enter__():一般称为上文方法,返回一个操作对象,比如操作文件的对象
- __exit__():一般称为下文对象,一般处理一些收尾的事情。
with语句修饰上下文管理器之后,会先调用上文对象,再执行with语句中的内容,最后执行下文对象。来上代码,模拟下open方法做的事情各位就懂了。
class File:
def __init__(self, file_name, file_mode):
self.file_name = file_name
self.file_mode = file_mode
def __enter__(self):
self.file = open(self.file_name, self.file_mode)
print("上文方法")
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
print("下文方法")
self.file.close()
with File("1.txt", "r") as f:
print(f.readline())
代码执行结果如下:
上文方法
文件内容
下文方法
可以看到经过with语句修饰后代码的执行顺序,上文方法->with内容->下文方法。