Python-@property装饰器和Property()函数

1.@property属性装饰器

使用属性装饰器可以将一个类方法转变成一个类属性。

class Person:
    def __init__(self,name):
        self.name = name
        self._age = 0
    def set_age(self,value):
        if value<0 or value > 120:
            print('参数不合法')
        else:
            self._age = value
    def get_age(self):
        return self._age

>>> p = Person()
>>> p.name = 'li'
>>> p.name
'li'
>>> p.set_age(-1)
参数不合法
>>> 
        

当我们想要使用name属性时,可以使用点语法p.name='li',非常的方便快捷。但在我们需要对赋值的变量进行数据筛选检查时,这时就无法满足需要了。我们需要重写属性的setter方法,和getter方法,然而,直接访问setter方法和getter方法,又会显得代码比较臃肿。此时,我们就可以使用@property修饰符。

 class Person:
    def __init__(self,name):
        self.name = name
        self._age = 10
    
    @property
    def age(self):
        return self._age

>>> p = Person('li')
>>> p.age
10

我们通过函数名age,就可以非常方便的读出_age的值,但此时_age属性在不直接访问时,相当于的是只读的。@property相当于重写了_age的getter方法,当然我们也有相应的setter方法和deleter方法。

在保持getter、setter、deleter使用同一个函数名的情况下,进行@函数名.setter 或者@函数名.deleter修饰

 class Person:
    def __init__(self,name):
        self.name = name
        self._age = 10
    
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self,value):
        if value<0 or value > 120:
            print('参数不合法')
        else:
            self._age = value
    @age.deleter
    def age(self):
        del self._age

        
>>> p = Person('li')
>>> p.age = 20
>>> p.age
20
>>> del p.age
>>> p.age
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    p.age
  File "<pyshell#4>", line 8, in age
    return self._age
AttributeError: 'Person' object has no attribute '_age'

注意:在使用@函数名.setter和@函数名.deleter方式时,必须要和@propety修饰的函数名保持一致,同时,也要使@propety修饰的函数在最前面,不然会报错。

2.property()函数

class property([fget[, fset[, fdel[, doc]]]])

  • fget -- 获取属性值的函数
  • fset -- 设置属性值的函数
  • fdel -- 删除属性值函数
  • doc -- 属性描述信息
class Person:
    def __init__(self):
        self._age = 0
    def set_age(self,value):
        if value<0 or value > 120:
            print('参数不合法')
        else:
            self._age = value
    def get_age(self):
        return self._age
    def del_age(self):
        del self._age
    age = property(get_age,set_age,del_age)
    
>>> p = Person()
>>> p.age = -1
参数不合法
>>> p.age = 12
>>> p.age
12

property()函数的作用就是把变量age与函数set_age、get_age等关联起来,通过age可以直接访问setter和getter方法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容