博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python property
阅读量:6305 次
发布时间:2019-06-22

本文共 2733 字,大约阅读时间需要 9 分钟。

python property

在2.6版本中,添加了一种新的类成员函数的访问方式--property。

原型

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

fget:获取属性

fset:设置属性

fdel:删除属性

doc:属性含义

用法

1.让成员函数通过属性方式调用

class C(object):    def __init__(self):        self._x = None    def getx(self):        return self._x    def setx(self, value):        self._x = value    def delx(self):        del self._x    x = property(getx, setx, delx, "I'm the 'x' property.")
a = C()print C.x.__doc__ #打印docprint a.x #调用a.getx()a.x = 100 #调用a.setx()print a.xtry:    del a.x #调用a.delx()    print a.x #已被删除,报错except Exception, e:    print e

输出结果:

I'm the 'x' property. None100'C' object has no attribute '_x'

2.利用property装饰器,让成员函数称为只读的

class Parrot(object):    def __init__(self):        self._voltage = 100000    @property    def voltage(self):        """Get the current voltage."""        return self._voltagea = Parrot()print a.voltage #通过属性调用voltage函数try:    print a.voltage() #不允许调用函数,为只读的except Exception as e:    print e

输出结果:

100000'int' object is not callable

3.利用property装饰器实现property函数的功能

class C(object):    def __init__(self):        self._x = None    @property    def x(self):        """I'm the 'x' property."""        return self._x    @x.setter    def x(self, value):        self._x = value    @x.deleter    def x(self):        del self._x

其他应用

1.bottle源码中的应用

class Request(threading.local):    """ Represents a single request using thread-local namespace. """    ...    @property    def method(self):        ''' Returns the request method (GET,POST,PUT,DELETE,...) '''        return self._environ.get('REQUEST_METHOD', 'GET').upper()    @property    def query_string(self):        ''' Content of QUERY_STRING '''        return self._environ.get('QUERY_STRING', '')    @property    def input_length(self):        ''' Content of CONTENT_LENGTH '''        try:            return int(self._environ.get('CONTENT_LENGTH', '0'))        except ValueError:            return 0    @property    def COOKIES(self):        """Returns a dict with COOKIES."""        if self._COOKIES is None:            raw_dict = Cookie.SimpleCookie(self._environ.get('HTTP_COOKIE',''))            self._COOKIES = {}            for cookie in raw_dict.values():                self._COOKIES[cookie.key] = cookie.value        return self._COOKIES

2.在django model中的应用,实现连表查询

from django.db import modelsclass Person(models.Model):     name = models.CharField(max_length=30)     tel = models.CharField(max_length=30)class Score(models.Model):      pid = models.IntegerField()      score = models.IntegerField()            def get_person_name():            return Person.objects.get(id=pid)       name = property(get_person_name) #name称为Score表的属性,通过与Person表联合查询获取name

 

转载于:https://www.cnblogs.com/coder2012/p/4433703.html

你可能感兴趣的文章
[WinAPI] 获取窗口句柄的几种方法
查看>>
《PHP对象、模式与实践》之高级特性
查看>>
设计模式之代理模式(Proxy)
查看>>
创建游标.存储过程及包
查看>>
ios语音输入崩溃
查看>>
JavaScript——DataListBox(组合框)
查看>>
浅谈ADO.NET中的五个主要对象
查看>>
超简单实现地球坐标转高德地图坐标
查看>>
Insert Oracle CLOB column
查看>>
介绍一个JSONP 跨域访问代理API-yahooapis
查看>>
4.5. JS Minification
查看>>
单元文件结构
查看>>
备份与恢复数据库的存储过程
查看>>
OpenStack设计与实现5——RESTful API和WSGI
查看>>
在Ubuntu下搭建Spark群集
查看>>
SpringBoot实现文件上传下载的功能
查看>>
FLEX程序设计--事件和事件机制--鼠标事件
查看>>
给表格的单元格增加编辑功能(In place edit)
查看>>
面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用...
查看>>
世界那么Big,组件那么Small
查看>>