为何要有property?
在此之前,我们先实现封装的特性之一:属性的私有,既通过get/set/del方法实现
class Person:
def __init__(self, name):
self.__name = name
def getname(self):
return self.__name
def setname(self, value):
self.__name = value.lower()
return self.__name
def delname(self):
del self.__name
return self.__name
p = Person('Alice')
print(p.getname()) # 输出:'Alice'
print(p.setname('Bob')) # 输出:'bob'
print(p.delname()) # 抛出 AttributeError
其次考虑.get/set/del方法虽然实现了属性的私有,但是使用者调用并不方便,而property则可以将这些方法伪装成属性,使用者不再需要通过get/set/del方法调用
class Person:
def __init__(self, name):
self.__name = name
def getname(self):
return self.__name
def setname(self, value):
self.__name = value.lower()
def delname(self):
del self.__name
name=property(getname,setname,delname) # 这里的name与self.__name应同名
p = Person('Alice')
print(p.name) # 输出:'Alice'
p.name = 'Bob'
print(p.name) # 输出:'bob'
del p.name
print(p.name) # 抛出 AttributeError
注意property的传参顺序是get/set/del,原因是源码的位置传参
但是用property()这种方法太麻烦了,还是用语法糖实现吧
class Person:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name.capitalize()
@name.setter
def name(self, value):
self.__name = value.lower()
print(self.__name) # 输出: 'bob'
@name.deleter
def name(self):
del self.__name
p = Person('Alice')
print(p.name) # 输出:'Alice'
p.name = 'Bob'
print(p.name) # 输出:'Bob'
del p.name
print(p.name) # 抛出 AttributeError