@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()
这个方法