python 描述符@property

本文深入探讨了Python中对象属性的概念,包括正常变量、保护变量和私有变量的区别,以及如何使用@property装饰器来优雅地控制属性的读写操作,使代码更加清晰和易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、python对象属性

1、正常变量

对象可对变量动态赋值

2、保护变量

变量或方法名以_开始,需通过API设置和修改

3、私有变量

变量或方法名以__开始,类内部调用,子类也无法调用

二、获取和设置类属性

1、自定义set_attr和get_attr

class People(object):
    def __init__(self, name):
        self.name = name
        pass


if __name__=="__main__":
    p = People('test')
    p.name = '1111111111'
    print(p.name)

姓名为数字显然不符合我们的预期,如果我们要限制姓名为英文字符,我们可以为People添加set_name和get_name方法,如下:

class People(object):
    def __init__(self, name):
        self._name = name
    
    def get_name(self):
        return self._name
    
    def set_name(self, val):
        # 对val进行判断
        self._name = val

虽然达到了限制用户输入的目的,但是每次设置都得调用obj.set_name,obj.get_name方法,很麻烦。

2、 使用@property

python内置的property可以把类方法设置为属性,使用@property相当于实现了getattr,同时实现了@attr.setter的装饰器,@attr.setter负责设置属性的值,如果不实现@attr.setter则属性为只读。


class People(object):
    def __init__(self, name, birth):
        self._name = name
        self._age = 0
        self.birth = birth

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, val):
        # 判断val
        self._name = val

    @property
    def age(self):
        return 2019 - self.birth


if __name__ == "__main__":
    p = People('test', 1990)
    p.name = 'zhangsan'
    print(p.name)
    p.age = 22

运行结果:

p.age = 22   AttributeError: can't set attribute
zhangsan

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值