[python]关于property的基础使用

为何要有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值