频道栏目
首页 > 程序开发 > Web开发 > Python > 正文
python property
2015-04-17 09:05:38           
收藏   我要投稿
原型

 

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__ #打印doc

print a.x #调用a.getx()

 

a.x = 100 #调用a.setx()

print a.x

 

try:

    del a.x #调用a.delx()

    print a.x #已被删除,报错

except Exception, e:

    print e

 

 

输出结果:

 

I'm the 'x' property.

None

100

'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._voltage

 

a = 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 models

 

class 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

点击复制链接 与好友分享!回本站首页
相关TAG标签
上一篇:从Python传递JSON到JavaScript
下一篇:python xml解析例子
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站