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

 


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-09-16 18:34:59

python property的相关文章

Python Property属性的2种用法

  这篇文章主要介绍了Python Property属性的2种用法,本文分别给出了两种用法的代码实例,需要的朋友可以参考下 假设定义了一个类:C,该类必须继承自object类,有一私有变量_x 代码如下: class C: def __init__(self): self.__x=None 1.现在介绍第一种使用属性的方法: 在该类中定义三个函数,分别用作赋值.取值和删除变量(此处表达也许不很清晰,请看示例) def getx(self): return self.__x def setx(se

python property装饰器

直接上代码: 1 #!/usr/bin/python 2 #encoding=utf-8 3 4 """ 5 @property 可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式 6 """ 7 8 class Parrot: 9 #class Parrot(object): #报错,AttributeError: can't set attribute' 10 def __init__(self): 1

Python进阶之“属性(property)”详解

来源:http://python.jobbole.com/80955/ Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将类方法转换为只读属性 重新实现一个属性的setter和getter方法 在本文中,您将学习如何以几种不同的方式来使用内置的属性函数.希望读到文章的末尾时,你能看到它是多么有用. 开始 使用属性函数的最简单的方法之一是将它作为一个方法的装饰器来使用.这可以让你将一个类方法转变成一个类属性.当我需

Python 奇技淫巧

显示有限的接口到外部 当发布python第三方package时,并不希望代码中所有的函数或者class可以被外部import,在__init__.py中添加__all__属性,该list中填写可以import的类或者函数名, 可以起到限制的import的作用, 防止外部import其他函数或者类. #!/usr/bin/env python # -*- coding: utf-8 -*- from base import APIBase from client import Client fro

Python类的用法介绍

第一形式 # !/usr/bin/env python # coding=utf-8 class Person(object): #object表示继承自object类,Python3中可省略次内容     """     This is a sample of Class     """     breast = 90  #类的属性 是静态变量         def __init__(self, name): #初始化方法  self为对象实

介绍Python的@property装饰器的用法

  这篇文章主要介绍了介绍Python的@property装饰器的用法,是Python学习进阶中的重要知识,代码基于Python2.x版本,需要的朋友可以参考下 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: ? 1 2 s = Student() s.score = 9999 这显然不合逻辑.为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score

python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享_python

分享一下刚遇到的一个小问题,我有一段类似于这样的python代码: 复制代码 代码如下: # coding: utf-8 class A(object):     @property     def _value(self): #        raise AttributeError("test")         return {"v": "This is a test."}     def __getattr__(self, key):  

Python中用Descriptor实现类级属性(Property)详解_python

上篇文章简单介绍了python中描述器(Descriptor)的概念和使用,有心的同学估计已经Get√了该技能.本篇文章通过一个Descriptor的使用场景再次给出一个案例,让不了解情况的同学可以更容易理解. 先说说decorator 这两个单词确实是有些相似,同时在使用中也是形影不离.这也给人造成了理解上的困难,说装饰器和描述器到底是怎么回事,为什么非得用一个@符号再加上描述器才行. 很多文章也都把这俩结合着讲,我自己看完之后都会觉得很绕.其实学习一个知识点,和做项目开发一个功能是一样的.在

通过代码学习python之@property,@staticmethod,@classmethod

URL: https://www.the5fire.com/python-property-staticmethod-classmethod.html #coding=utf-8 class MyClass(object): def __init__(self): print 'init' self._name = 'the5fire' @staticmethod def static_method(): print 'this is a static method!' @classmethod