1. 何为装饰器?

  官方定义:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

  Python中总共包括三个内置装饰器:

    ① staticmethod

    ② classmethod

    ③ property

  更加详细的解释,请点击(传送门

2. 属性函数 property() 浅谈

  2.1 为什么要使用 property?

      通常,我们在访问属性和给属性赋值的时候,都是对 类和实例 __dict__ 打交道的;但如果我们想要规范属性访问,有两种方式可用:①数据描述符 ,②. property() 属性函数。

      然而,我们知道,描述符相对比较复杂,对于新手来说,用起来很吃力,那么不妨试试property(),相对于描述符这个大的进程,property就相当于线程。

  2.2 函数原型:

    property(fget=None, fset=None, fdel=None, doc=None)

  2.3 普通方法定义:

    假设 calss Normal中有一个私有变量 __x,如下代码所示:

 #code 1

 class Normal:
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 tN = Normal()
print(tN.__count) #输出结果(报错了)
Traceback (most recent call last):
File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/property.py", line 15, in <module>
print(tN.__count)
AttributeError: 'Normal' object has no attribute '__count'

  为啥报错了呢?因为 实例tN的属性 __x 为私有属性,不能直接访问,为此我们只能调用内部定义的 方法;

 tN = Normal()
tN.setx(10)
print(tN.getx()) #输出结果:
10

  嗯,使用内部的方法,可以容易的得到实例的或者类的私有属性值;

  然而,如果我那一天兴致来潮,把 class Normal 的 setx方法名改成了其它(如 Normal_setx),外部很多地方用到了该函数,是不是我需要一个一个的去找该方法的调用地点,然后一个一个的改呢?

  c语言或许会,但Python,一个智能化的语言,怎么会这么点事都解决不了呢?

  那么,该如何解决以上请呢?

  哈哈,其实有两种方法哦,听我慢慢道来哦!

  方法一:采用 属性函数property()

 #改进方法一

 class Normal:
def __init__(self):
self.__x = None
def getx(self):
print('getx(): self.__x=', self.__x)
return self.__x
def setx(self, value):
self.__x = value
print('setx()')
def delx(self):
print('delx()')
del self.__x y = property(getx, setx, delx, "I'm a property") tN=Normal()
tN.y=10
tN.y
del tN.y #输出结果:
setx()
getx(): self.__x= 10
delx()

    哈哈,直接把方法当属性来操作了,好流弊的样子!

  方法二:采用 @property 装饰器

 #改进方法二

 class Normal:

     def __init__(self):
self.__x = None @property
def xx(self):
print('getx(): self.__x=', self.__x)
return self.__x @xx.setter
def xx(self, value):
self.__x = value
print('setx()') @xx.deleter
def xx(self):
print('delx()')
del self.__x tN=Normal()
tN.xx=10
tN.xx
del tN.xx #输出结果信息:
setx()
getx(): self.__x= 10
delx()

    哈哈,怎么样,跟方法一输出一样的结果,证明,这两种方法都可行的(注意哦,第一个一定是 @property(替代getter哦,不然会报错))。

Python装饰器之 property()的更多相关文章

  1. Python装饰器之functools.wraps的作用

    # -*- coding: utf-8 -*- # author:baoshan def wrapper(func): def inner_function(): pass return inner_ ...

  2. python装饰器--@property

    @property 考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name sel ...

  3. Python 装饰器 property() 函数

    描述:property() 函数的作用是在新式类中返回属性值. @property 装饰器简单理解就是负责把一个方法变成属性调用 下面理解property()方法语法: class property( ...

  4. Python 装饰器之 functools.wraps

    在看 Bottle 代码中看见 functools.wraps 这种用法. def make_default_app_wrapper(name): """ Return ...

  5. python 装饰器之应用示例

    import time import hashlib import pickle import threading #装饰函数缓存应用 cache ={} def is_obsolete(entry, ...

  6. python装饰器之函数作用域

    1.函数作用域LEGB L:local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 passline = 60 def fu ...

  7. python装饰器之使用情景分析

    http://blog.csdn.net/yueguanghaidao/article/details/10089181

  8. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  9. python学习之类和实例的属性;装饰器@property

    无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict ...

随机推荐

  1. [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]

    Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...

  2. linux系统编程之信号(五):信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

  3. ADO.NET操作PostgreSQL:数据库操作类(已封装)

    1.增.删.改通用方法 /// <summary> /// 增.删.改通用方法 /// </summary> /// <param name="commandT ...

  4. BitAdminCore框架更新日志20180519

    20180519更新内容 昨天更新的版本,早上自己下载下来发现创建项目不成功. 这个问题已经多次出现,主要是cookiecutter编码问题,项目引用大量外部js文件,部分文件在复制的时候编码较验不通 ...

  5. 《Python绝技:运用Python成为顶级黑客》 用Python进行取证调查

    1.你曾经去过哪里?——在注册表中分析无线访问热点: 以管理员权限开启cmd,输入如下命令来列出每个网络显示出profile Guid对网络的描述.网络名和网关的MAC地址: reg query &q ...

  6. 基于unoconv的在线office预览

    这几天在搞在线文档预览,网上查了几种方案, 第一种:使用google的在线预览 -> 国内被Q,pass 第二种:使用第三方的,比如:永中dcs -> 要钱,pass 第三种:先转换为pd ...

  7. python爬虫3——获取审查元素(板野友美吧图片下载)

    测试环境:python2.7 + beautifulsoup4.4.1 + selenium2.48.0 测试网址:http://tieba.baidu.com/p/2827883128 目的是下载该 ...

  8. Java内存模型Cookbook

    前言 指令重排 内存屏障 多处理器 指南 前言 这是一篇用于说明在JSR-133中制定的新Java内存模型(JMM)的非官方指南. 这篇指南提供了在最简单的背景下各种规则存在的原因,而不是这些规则在指 ...

  9. MVC4删除 pages引发的异常 System.Web.Optimization找不到引用

    在MVC4的开发中,如果创建的项目为空MVC项目,那么在App_Start目录下没有BundleConfig.cs项的内容,在手动添加时在整个库中都找不到:System.Web.Optimizatio ...

  10. Oracle性能问题sql调优脚本集

    ---------------------------------------------------------------------------------------------------- ...