Python装饰器之 property()

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,如下代码所示:

 1 #code 1
 2
 3 class Normal:
 4     def __init__(self):
 5         self.__x = None
 6     def getx(self):
 7         return self.__x
 8     def setx(self, value):
 9         self.__x = value
10     def delx(self):
11         del self.__x
12
13
14 tN = Normal()
15 print(tN.__count)
16
17 #输出结果(报错了)
18 Traceback (most recent call last):
19   File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/property.py", line 15, in <module>
20     print(tN.__count)
21 AttributeError: ‘Normal‘ object has no attribute ‘__count‘

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

1 tN = Normal()
2 tN.setx(10)
3 print(tN.getx())
4
5 #输出结果:
6 10

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

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

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

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

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

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

 1 #改进方法一
 2
 3 class Normal:
 4     def __init__(self):
 5         self.__x = None
 6     def getx(self):
 7         print(‘getx(): self.__x=‘, self.__x)
 8         return self.__x
 9     def setx(self, value):
10         self.__x = value
11         print(‘setx()‘)
12     def delx(self):
13         print(‘delx()‘)
14         del self.__x
15
16     y = property(getx, setx, delx, "I‘m a property")
17
18
19 tN=Normal()
20 tN.y=10
21 tN.y
22 del tN.y
23
24 #输出结果:
25 setx()
26 getx(): self.__x= 10
27 delx()

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

  方法二:采用 @property 装饰器

 1 #改进方法二
 2
 3 class Normal:
 4
 5     def __init__(self):
 6         self.__x = None
 7
 8     @property
 9     def xx(self):
10         print(‘getx(): self.__x=‘, self.__x)
11         return self.__x
12
13     @xx.setter
14     def xx(self, value):
15         self.__x = value
16         print(‘setx()‘)
17
18     @xx.deleter
19     def xx(self):
20         print(‘delx()‘)
21         del self.__x
22
23
24 tN=Normal()
25 tN.xx=10
26 tN.xx
27 del tN.xx
28
29 #输出结果信息:
30 setx()
31 getx(): self.__x= 10
32 delx()

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

时间: 2024-10-12 04:58:22

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

python装饰器之自己的理解,欢迎更正

pre.cjk { font-family: "Nimbus Mono L", monospace } h2.western { font-family: "Liberation Sans", sans-serif; font-size: 16pt } h2.cjk { font-family: "Noto Sans CJK SC Regular"; font-size: 16pt } h2.ctl { font-family: "Fr

python装饰器@property

装饰器示例 def w1(func): def inner(): print('...验证权限...') func() return inner @w1 def f1(): print('f1 called') @w1 def f2(): print('f2 called') f1() f2() 输出结果: ...验证权限... f1 called ...验证权限... f2 called 当调用f1,f2函数时,首先执行了验证.通过一个闭包函数w1,调用函数上通过关键词@w1,对f1,f2完成

python装饰器之函数作用域

1.函数作用域LEGB L:local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 passline = 60 def func(val): passline = 90 if val >= passline: print('pass') else: print('failed') def in_func() print(val) in_func() def Max(val1,val2): return max(val1,

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

无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict__可以查看类Ab的属性 us1 = Ab() us2 = Ab() # 定义两个实例对象us1.us2,这两个实例自身并不具备任何属性 # 只有在__init__中定义了self.arg=xxx的情况下,实例默认会具备arg属性 动态语言中,属性自带操作方法:获取(读).设置(写):还可以定义删除

Python中的@property装饰器

要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: 1 class Student(object): 2 def __init__(self,name,score): 3 self.name=name 4 self.score=score 创建实例,运行结果: 1 tim=Student('Tim',97) 2 tim.score=100 3 tim.score 4 100 5 mary=Student('Mary',90) 6 m

python 之用装饰器@property,把方法变成一个特性

# -*- coding: utf-8 -*- """ Created on Sun Nov 13 23:19:03 2016 @author: toby """ #知识点:用装饰器@property,把方法变成一个特性 class Province:     memo = 'One of China\'s 23 provinces' #静态字段          def __init__(self,name,capital,leadership

回顾Python装饰器

函数装饰器(function decorator)可以对函数进行“标注”,给函数提供更多的特性. 在理解装饰器之前需要理解闭包(closure).Python3.0 引入了保留关键字 nonlocal,使用闭包同样也离不开 nonlocal.顺便说一句,闭包除了用在装饰器上,对于异步编程也是很重要的概念. 装饰器(decorator)是一个可调用的装饰函数,它接收另一个函数作为参数. 假设已经定义好了一个装饰器 decorate(decorate 实际上是一个接收函数并且返回函数的函数),那么以

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

Python装饰器详解

装饰器简介: 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用. 一个简单装饰器写法: 在写装饰器之前我们需要简单了解下python语法糖@的用法 http://www.cnblogs.com/Egbertbaron/p/72425