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. The transaction associated with this command is not the connection's active transaction

    The fix is fairly simple: if you want a Dapper query to participate in a connection, explicitly deno ...

  2. BlangenOA项目总结

    1.使用EF,当返回的是IQueryable<T>类型,延迟加载. 2.增删改查 分页(页码,页大小,总记录数,是否升序)(两个lambda表达式,一个筛选规则,一个是排序规则(可以选择类 ...

  3. [ASP.NET]ASP.NET中常用的26个优化性能方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  4. 使用JQuery插件Jcrop进行图片截取

    Jcrop插件本身并不含有图片截取功能,它仅仅是在前端层面构建一套截取动画效果并产生4个坐标点,插件使用者将这4个坐标点传回至服务器接口上进行截取操作.其优点是具有较高的通用性.浏览器兼容性(IE6+ ...

  5. Java中的String,StringBuilder,StringBuffer的区别

    这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > ...

  6. asp.net core读取appsetting.json文件

    1.在Startup.cs文件中注入,ConfigureServices方法 services.Configure<MyConfig>(Configuration.GetSection(& ...

  7. Linux快速学习系列

    这篇文章会随着学习的进行,不断的更新!!! 总结 操作系统引入的抽象概念 进程(process) 地址空间(address space) 虚拟内存(virtual memory) 操作系统引入的cah ...

  8. “全栈2019”Java多线程第二十三章:活锁(Livelock)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. jzoj5878

    tj:這道題可以想到排列組合 對於第一問,我們知道,左轉的次數比右轉次數多4,所以答案是c(n,n/2-2) 對於第二問,我們發現,不能出現下凹的情況,所以不能同時出現2個左拐,且路徑可以分為4段,且 ...

  10. Apache Log4j配置说明

    1.Log4j简介 Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息.Log4j主要由三大类组件构成: 1)Logger-负责输出日志信息,并能够对日志信息进行分类筛选,即决 ...