python @property的介绍与使用
python的@property是python的一种装饰器,是用来修饰方法的。
作用:
我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
使用场景:
1.修饰方法,是方法可以像属性一样访问。
class DataSet(object):
@property
def method_with_property(self): ##含有@property
return 15
def method_without_property(self): ##不含@property
return 15
l = DataSet()
print(l.method_with_property) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
print(l.method_without_property()) #没有加@property , 必须使用正常的调用方法的形式,即在后面加()
两个都输出为15。
class DataSet(object):
@property
def method_with_property(self): ##含有@property
return 15
l = DataSet()
print(l.method_with_property()) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
如果使用property进行修饰后,又在调用的时候,方法后面添加了(), 那么就会显示错误信息:TypeError: ‘int’ object is not callable,也就是说添加@property 后,这个方法就变成了一个属性,如果后面加入了(),那么就是当作函数来调用,而它却不是callable(可调用)的。
class DataSet(object):
def method_without_property(self): ##不含@property
return 15
l = DataSet()
print(l.method_without_property) #没有加@property , 必须使用正常的调用方法的形式,即在后面加()
没有使用property修饰,它是一种方法,如果把括号去掉,不会报错输出的就会是方法存放的地址。
2.与所定义的属性配合使用,这样可以防止属性被修改(定义只读属性)。
由于python进行属性的定义时,没办法设置私有属性,因此要通过@property的方法来进行设置。这样可以隐藏属性名,让用户进行使用的时候无法随意修改。
class DataSet(object):
def __init__(self):
self._images = 1
self._labels = 2 #定义属性的名称
@property
def images(self): #方法加入@property后,这个方法相当于一个属性,这个属性可以让用户进行使用,而且用户有没办法随意修改。
return self._images
@property
def labels(self):
return self._labels
l = DataSet()
#用户进行属性调用的时候,直接调用images即可,而不用知道属性名_images,因此用户无法更改属性,从而保护了类的属性。
print(l.images) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
解释setter和getter的使用方法以及@property装饰器的妙用
在python中,setter和getter方法并不像其它编程语言中的那样。基本上,在面向对象编程语言中,使用setter和getter方法的主要目的是为了确保数据的封装。不像其它面向对象编程语言,python中的私有变量并不是真正的隐藏字段。在python中,通常在以下情况会用到setter和getter方法:在获取或者设置属性值的时候使用setter和getter方法为其添加验证逻辑
避免对类的某些字段直接访问,比如类的私有变量不应该被外部调用者直击访问或者修改
使用普通函数实现setter和getter方法
要实现setter和getter属性:
- 定义普通方法get()和set()
class Student():
def __init__(self, age):
self.__age = age
# getter方法
def get(self):
return self.__age
# setter方法
def set(self, value):
print("---------",value)
self.__age = value
student = Student(18)
# 使用getter方法返回age
print(student.get())
# 使用setter方法设置age
student.set(20)
# 使用getter方法返回age
print(student.get())
print(student.get())
print(dir(student))
- 使用property()方法来实现setter和getter的行为
property()是python中的一个内置方法,它创建并返回一个属性对象。一个属性对象有三个方法,getter()、setter()和delete()。property()内置方法有四个参数,property(fget,fset, fdel, doc)。fget是一个用于获取属性值的函数,fset是一个用于设置属性值的函数,fdel是一个用于删除属性的函数,doc用于为属性创建文档说明。一个属性兑现有三个方法,getter()、setter()和delete()分别制定fget、fset、fdel。
class people():
def __init__(self):
self.__age = 18
def get_age(self):
print('getter() method called')
return self.__age
def set_age(self, value):
print('setter() method called')
self.__age = value
def del_age(self):
del self.__age
age = property(get_age, set_age, del_age)
age = property(get_age, set_age, del_age,"123")
print(people.age.__doc__)
laowang = people()
print(laowang.age)
laowang.age = 60
print(laowang.age)
del laowang.age
print(laowang.age)
- 使用@property装饰器来实现setter和getter的行为
class people():
def __init__(self):
self.__age = 18
# 使用装饰器的时候,需要注意:
# 1. 装饰器名,函数名需要一直
# 2. property需要先声明,再写setter,顺序不能倒过来
@property
def age(self):
print('getter() method called')
return self.__age
@age.setter
def age(self, value):
print('setter() method called')
self.__age = value
@age.deleter
def age(self):
del self.__age