欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 描述符@property

程序员文章站 2022-06-08 15:37:46
...

一、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

 

相关标签: @property