1. 通俗理解
简单来讲就是以调用属性的方式来调用方法。
虽然看上去调用的是普通属性,或者给属性赋值,但实际上是调用的指定的某个方法来获取数据或者设置数据
2. 举个例子
举个例子先了解一下property属性
实现功能:输入姓名,获取对应的年龄
1. 普通方法
class People():
def __init__(self,name) -> None:
self.name = name
self.age = None
def get_age(self):
if self.name == "IU":
return 18
if self.name == "lisa":
return 20
else:
return "不存在"
people = People("IU")
print(people.get_age())
2. 使用property属性
class People():
def __init__(self,name) -> None:
self.name = name
@property
def get_age(self):
if self.name == "IU":
return 18
if self.name == "lisa":
return 20
else:
return "不存在"
people = People("IU")
print(people.get_age) # 这就是porperty属性的作用,用调用属性的方式来调用方法
第一种普通方法,我们还需要对self.age进行定义和初始化,显得有点麻烦。
类中,方法也可以看作是属性,而property属性就是这一理念的贯彻
3. 使用property属性时的注意点
(1)@property只能放在实例方法上面,并且该方法只接受一个参数self
(2)调用被property装饰的实例方法时,不需要加()
4. 再举一个例子深刻理解一下
实现功能:模拟淘宝商品页翻页,规定每页10个商品,输入页数,返回商品的起始位置和终止位置
class FlipPage():
def __init__(self,current_page) -> None:
self.current_page = current_page
@property
def start_position(self):
return (self.current_page-1)*10
@property
def stop_position(self):
return (self.current_page-1)*10+9
fp = FlipPage(3)
print(fp.start_position,"_",fp.stop_position)
3. 深入探究对类的实例方法的装饰
在Python中的类分为经典类和新式类,新式类的属性对经典类要丰富的多,一般来说只要该类继承了object,则该类就是新式类,在python3.x版本即使不写object,默认也是继承object,而在python2.x版本中的类都是经典类
针对于property属性来讲:
经典类只有@property一种装饰器,
新式类有@property,@xxx_setter,@xxx_deleter三种装饰器
@property不用说了,上面的几个例子体现过了
下面需要讨论一下@xxx_setter,@xxx_deleter这两种装饰器
举个例子展示一下:
class Display():
def __init__(self) -> None:
pass
@property
def show(self):
return "@property"
@show.setter
def show(self,value):
return "@property.setter---{0}".format(value)
@show.deleter
def show(self):
return "@property.deleter"
d = Display()
print(d.show) #执行@property修饰的实例方法show(),获取该方法的返回值
d.show = 1 #执行@xxx.setter修饰的实例方法show(),将值传递给参数value
del d.show #执行@xxx.deleter修饰的实例方法show()
@xxx_setter,@xxx_deleter中的xxx就是被修饰的实例方法名
通俗的可以这个show()实例方法理解为属性,那么@property,@xxx_setter,@xxx_deleter三种装饰器分别就代表着对属性的获取,修改,删除。
4. property属性的另外一种使用方法
先看一下例子:
class A():
def test(self):
return "test"
q = property(test)
a = A()
print(a.q)
property的另一种应用:创建值为property对象的类属性,这种应用不区分经典类和新式类
关于property()方法的说明:
property方法中有四个参数
- 第1个参数:方法名,调用
对象.属性
时自动触发执行方法 - 第2个参数:方法名,调用
对象.属性 = XXX
时自动触发执行方法 - 第3个参数:方法名,调用
del 对象.属性
时自动触发执行方法 - 第4个参数:字符串,调用 类名.属性.__doc__,此参数是该属性的描述信息
举个例子展示一下:
class Goods():
def __init__(self) -> None:
self.price = "20¥"
def get_price(self):
return self.price
def set_price(self,p):
self.price = p
def del_price(self):
del self.price
#类属性
pr = property(get_price,set_price,del_price,"存储的是价格信息")
goods = Goods()
#直接调用类属性就行了,不用再实例对象.方法名了
print(goods.pr)
goods.pr = "30¥"
print(goods.pr)
print(Goods.pr.__doc__)
del goods.pr
print(goods.pr)
"""
运行结果:
20¥
30¥
存储的是价格信息
Traceback (most recent call last):
File "c:\Users\q1994\Desktop\学习\Pyhton\29-property属性.py", line 79, in <module>
print(goods.pr)
File "c:\Users\q1994\Desktop\学习\Pyhton\29-property属性.py", line 65, in get_price
return self.price
AttributeError: 'Goods' object has no attribute 'price'
"""