python @property、@setter、@deleter的介绍与使用

发布时间 2023-06-07 18:15:21作者: zlbingo

@property是一个装饰器,使一个方法可以像属性一样被使用,而不需要在调用的时候带上()

0x01 @property使用

我们通过一个简单的研发需求为背景,逐步解释各个装饰器的使用

这里领导给了个需求,开发一个类,可以返回一个人的姓,名字以及全名,十分简单嘛

class Person():

    def __init__(self, firstname, lastname):
        self.first_name = firstname
        self.last_name = lastname
        self.fullname = self.first_name + ' '+ self.last_name

zhangsan = Person("zhang", "san")

print(zhangsan.first_name) # zhang

print(zhangsan.last_name) # san

print(zhangsan.fullname) # zhang san

下班!

上线之后,各下游都已经开始调用该接口,突然有一天发现用户改了下last_name,但是fullname没有变:

zhangsan.last_name = "si"

print(zhangsan.last_name) # si

print(zhangsan.fullname) # zhang san

领导说,不行你得改!

我这一想简单啊,写个fullname的方法,每次调用属性不就行了,于是就改成这样:

class Person():

    def __init__(self, firstname, lastname):
        self.first_name = firstname
        self.last_name = lastname

    def fullname(self):
            self.fullname = self.first_name + ' '+ self.last_name

zhangsan = Person("zhang", "san")

zhangsan.last_name = "si"

print(zhangsan.last_name) # si

print(zhangsan.fullname()) # zhang si

这不完事了,多加个括号的事(zhangsan.fullname-> zhangsan.fullname()),开开心心下班回家!

第二天,你一到公司,调用你接口的下游的同事张嘴就开始‘x@3#$5,你改了接口之后,老子昨天调用失败了一天’,你定位了一下原来是他们调用的是fullname这个属性,而不是fullname()这个方法

参考文章