博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python装饰器之 property()
阅读量:4324 次
发布时间:2019-06-06

本文共 2638 字,大约阅读时间需要 8 分钟。

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 = value10     def delx(self):11         del self.__x12 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 
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 = value11         print('setx()')12     def delx(self):13         print('delx()')14         del self.__x15 16     y = property(getx, setx, delx, "I'm a property")17 18 19 tN=Normal()20 tN.y=1021 tN.y22 del tN.y23 24 #输出结果:25 setx()26 getx(): self.__x= 1027 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.__x12     13     @xx.setter14     def xx(self, value):15         self.__x = value16         print('setx()')17 18     @xx.deleter19     def xx(self):20         print('delx()')21         del self.__x22 23 24 tN=Normal()25 tN.xx=1026 tN.xx27 del tN.xx28 29 #输出结果信息:30 setx()31 getx(): self.__x= 1032 delx()

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

 

转载于:https://www.cnblogs.com/Jimmy1988/p/6813270.html

你可能感兴趣的文章
计算机基础(计算机专业)
查看>>
人人必知的10个 jQuery 小技巧
查看>>
【坦克大战】Unity3D多人在线游戏(泰课的坦克大战--旋转的螺丝钉)
查看>>
Android 开发BottomNavigationView学习
查看>>
unix-poll
查看>>
anaconda+youcompleteme
查看>>
HLS: High-Level Synthesis Operators
查看>>
消息队列Rabbit安装
查看>>
在 EF 中只对 日期(不包括时间)进行比较的方法
查看>>
C#关于等待窗体(转)
查看>>
CockroachDB学习笔记——[译]Cgo的成本与复杂性
查看>>
JS数组经典冒泡排序
查看>>
【leetcode】Trapping Rain Water(hard)
查看>>
关键字 static
查看>>
11. Container With Most Water
查看>>
别人抢红包,我们研究一下红包算法
查看>>
泛型的一些问题
查看>>
PHP与正则表达式 2 :一些修饰符与preg_match_all
查看>>
压八位高精度 高精操作大全
查看>>
进程、线程、协程和GIL(二)
查看>>