08-Python-property属性

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'
"""
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值