zoukankan      html  css  js  c++  java
  • 【python】面向对象编程之@property、@setter、@getter、@deleter用法

    @property装饰器作用:把一个方法变成属性调用

    使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法

    @property&@.setter

    class Person(object):
        
        @property
        def birth(self):
            return self._birth
    
        @birth.setter
        def birth(self,value):
            self._birth=value
    
    if __name__ == '__main__':
        p=Person()
        p.birth=1985
        print(p.birth)
    
    ---------------运行结果-----------------
    1985
    

      

    把方法变成属性,只需要在方法前添加@property装饰器即可。

    继续添加一个装饰器@birth.setter,给属性赋值

    @.getter

    上例中因为在birth方法中返回了birth值,所以即使不调用getter方法也可以获得属性值。接下来再将函数稍作修改,看下getter方法是怎么使用的。

    class Person(object):
        
        @property
        def birth(self):
            return 'my birthday is a secret!'
    
        @birth.setter
        def birth(self,value):
            self._birth=value
    
    if __name__ == '__main__':
        p=Person()
        p.birth=1985
        print(p.birth)
    
    ------------------运行结果------------------
    my birthday is a secret!
    

      

    因为将birth方法的返回值写了固定值,所以即使赋值成功,但是并不会打印。

    如果想打印出具体的值,可以增加getter方法。

    class Person(object):
        
        @property
        def birth(self):
            return self._birth
    
        @birth.setter
        def birth(self,value):
            self._birth=value
    
        @birth.getter
        def birth(self):
            return self._birth
    
    if __name__ == '__main__':
        p=Person()
        p.birth=1985
        print(p.birth)
    
    ------------------运行结果-------------------
    1985
    

     

    @.deleter

    @property含有一个删除属性的方法

    class Person(object):
        
        @property
        def birth(self):
            return self._birth
    
        @birth.setter
        def birth(self,value):
            self._birth=value
    
        @birth.getter
        def birth(self):
            return self._birth
        
        @birth.deleter
        def birth(self):
            del self._birth
    
    if __name__ == '__main__':
        p=Person()
        p.birth=1985
        print(p.birth)
        del p.birth
        print(p.birth)
    
    
    ---------------运行结果-----------------
    1985
    
    #删除birth属性后,再次访问会报错
    AttributeError: 'Person' object has no attribute '_birth'    
    

     

  • 相关阅读:
    EntityFramework 实践 Overview
    Retrofit 实践
    elasticsearch入门
    正则如何不匹配该内容
    windows下安装了2个python,如何下载模块到不同的python中
    python中 遇到的读取坑2.7和3.6版本的问题
    如何在idea中加载本地中已有的python
    如何在linux上有2个python的情况下安装gensim
    正则表达式,包含此内容(不管是前面还是后面)
    rdd里的foreach无法对外界产生影响
  • 原文地址:https://www.cnblogs.com/lilip/p/10615571.html
Copyright © 2011-2022 走看看