zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux发行版 CentOS6.5 修改默认主机名
    《Linux就该这么学》培训笔记_ch06_存储结构与磁盘划分
    《Linux就该这么学》培训笔记_ch05_用户身份与文件权限
    《Linux就该这么学》培训笔记_ch04_Vim编辑器与Shell命令脚本
    《Linux就该这么学》培训笔记_ch03_管道符、重定向与环境变量
    《Linux就该这么学》培训笔记_ch02_一些必须掌握的Linux命令
    《Linux就该这么学》培训笔记_ch01_部署虚拟环境安装Linux系统
    《Linux就该这么学》培训笔记_ch00_认识Linux系统和红帽认证
    Swift笔记2
    request对象和response对象
  • 原文地址:https://www.cnblogs.com/JohnABC/p/5685699.html
Copyright © 2011-2022 走看看