美文网首页大数据 爬虫Python AI Sql
Python-@property装饰器和Property()函数

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

作者: 葱花思鸡蛋 | 来源:发表于2019-06-18 11:39 被阅读0次
    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方法。

    相关文章

      网友评论

        本文标题:Python-@property装饰器和Property()函数

        本文链接:https://www.haomeiwen.com/subject/skoxqctx.html