![影片讀取中](/images/youtube.png)
喜歡彭彭的教學影片嗎?點擊「加入」按紐取得更多會員服務哦。 加入會員:https://www.youtube.com/channel/UCguZS-y7codLSt6vpkVdnKg/join 1. ... <看更多>
Search
喜歡彭彭的教學影片嗎?點擊「加入」按紐取得更多會員服務哦。 加入會員:https://www.youtube.com/channel/UCguZS-y7codLSt6vpkVdnKg/join 1. ... <看更多>
... 时间等操作)就可以使用装饰器。 装饰器是一个包装了另一个函数的特殊函数:主函数被调用,并且其返回值将会被传给装饰器,接下来装饰器将返回一个包装 ... ... <看更多>
Python 执行装饰器的时机. A key feature of decorators is that they run right ... 类似的装饰器被用在很多Python Web框架中,以便将函数加入到注册中心里,例如,映射 ... ... <看更多>
#1. Python進階技巧(3) — 神奇又美好的Decorator ,嗷嗚!
今天大家就著重在Decorator 如何使用,以及Decorator 使用時機吧! ... 最後附上一些延伸相關資料。 First-class function on Wiki · 理解Python 装饰器看这 ...
#2. [Python教學] decorator 裝飾詞原理到應用
Python 裝飾 詞(Decorator) 被大量廣泛的使用在各方library,是非常實用和必須了解的基礎,本篇介紹了從原理到應用,建議讀者可以跟著敲一次code,會對 ...
你可以把 @timing 視為加上timing 功能的意思。利用這樣的語法, 完全不需要更動原本叫用works 函式的程式, 就可以幫所有叫用works 函式的程式計時 ...
#4. 裝飾器decorator - Python 教學| STEAM 教育學習網
裝飾器 decorator 是Python 的一種程式設計模式,裝飾器本質上是一個Python 函式或類( class ),它可以讓其他函式或類,在不需要做任何代碼修改的前提下增加額外功能,裝飾 ...
#5. 看了肯定會的Python 裝飾子(decorator)教學- MyApollo
Python 的decorator (或稱裝飾子)是一個非常有用的功能,它的重要程度可以說是沒用過或不會用decorator 的人就等於沒學過Python, 甚至在一些常見的 ...
#6. Python 裝飾器Decorator - 基本篇By 彭彭 - YouTube
喜歡彭彭的教學影片嗎?點擊「加入」按紐取得更多會員服務哦。 加入會員:https://www.youtube.com/channel/UCguZS-y7codLSt6vpkVdnKg/join 1.
#7. Python 函数装饰器
装饰器 (Decorators)是Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。
#8. 快速理解並使用Python Decorator(裝飾器) - 只是個打字的
使用 decorator時,在呼叫 .__name__ 時,會變成decorator的名字,在debug時會難以查找問題。 · 使用Class-based Decorator的話,就不必functools.wraps來 ...
ClassMethods 使用時機: 不在需要將class 實例後才能使用函式,直接像以下範例呼叫People_ClassMethods.work(5) 即可使用 不同於StaticMethods,因為多引入了class ...
#10. Python Decorator 入門教學 - TechBridge 技術共筆部落格
這次我們先來認識一下Decorator 這個看似怪異但卻常被使用的設計模式。 什麼是Decorator. 簡單來說Decorator 程式語言的設計模式,也是一種特殊的function ...
#11. Python裝飾器(你想知道的這裡都有)
Python裝飾器 (你想知道的這裡都有) · 1. 裝飾器的定義 · 2. 裝飾器的範例程式碼 · 3. 裝飾器的語法糖寫法 · 4. 裝飾器的執行時機 · 5. 裝飾器的使用 · 6. 通用 ...
#12. 理解Python 装饰器看这一篇就够了- FooFish
如果你接触Python 有一段时间了的话,想必你对@ 符号一定不陌生了,没错 ... 装饰器在Python 使用如此方便都要归因于Python 的函数能像普通的对象一样 ...
#13. [後端小菜鳥] Python Decorator 實作學習
當時我還不知道使用Decorator來解決問題,可以砍掉專案一半的代碼 ... 什麼是Decorator. Decorator就是裝飾器, 如下列程式碼,很像 裝飾 在函式上的裝飾器.
#14. 装饰器
Python 的decorator可以用函数实现,也可以用类实现。 decorator可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。 请编写一个 ...
#15. Don't Reinvent Sandwich: Decorator - dokelung.me
但有的時候想要抽取的部分並非中間( 三明治的餡)連續的部分,而是頭尾(三明治的麵包),這個時候我們便需要使用一些其他的手法或機制來達到reuse 的目的了。Python 正好 ...
#16. 超详细的python装饰器攻略
这个示例把前面的Timer改成用类的形式定义,并且使用一个属性来存储每个具体实例的运行时间。 class Timer: def __init__(self, func): wraps(func)(self) ...
#17. 一文看懂Python系列之装饰器(decorator)(工作面试必读) 原创
... 时间)和插入日志等应用场景。有了装饰器 ... 大白话说,只要某个函数中引用了一些不在当前代码全局中定义的... 12步入门Python中的decorator装饰器使用方法.
#18. Python:有参数的装饰器:以显示函数执行时间为例
文章目录预备知识正文解释应用预备知识装饰器是一个函数。通过学习菜鸟教程来了解装饰器的基本概念、作用和Python语法。正文本文介绍一个用来显示函数 ...
#19. 深入了解Python装饰器函数
... 用这个装饰器装饰,做到计算函数执行时间?这怎么办呢?那就用下面代码。 import time def timer(func): def inner(*args,**kwargs): start = time ...
#20. python函数式编程之-装饰器(Decorators)
... 时间等操作)就可以使用装饰器。 装饰器是一个包装了另一个函数的特殊函数:主函数被调用,并且其返回值将会被传给装饰器,接下来装饰器将返回一个包装 ...
#21. Python中级知识之装饰器介绍
装饰器 调用的时候,使用@,它是Python 提供的一种编程语法糖,使用了之后会让你的 ... 在学习装饰器的时候,最常见的一个案例,就是统计某个函数的运行时间,接下来就为你 ...
#22. Python中的装饰器用法详解
... 用了多长时间,好吧,那么我们可以这样做:. import time def foo(): start = time ... 使用python装饰器语法:. 复制代码代码如下: @bread @ingredients def sandwich ...
#23. Python装饰器入门:从理解到应用
装饰器 非常经典的应用就是打印日志,比如打印时间、地点、访问记录等等。 ... 叠加装饰器. 装饰器可以叠加使用,像下面这样:. import functools def inc ...
#24. 【Python-装饰器】装饰器的运行顺序以及运行时机
在这里我们需要使用到https://pythontutor.com/render.html#mode=display这个网站。该网站可以一步一步的输出整段代码的运行流程。
#25. Python: 使用装饰器“@”取得函数执行时间 - oldj's blog
Python 中可以使用装饰器对函数进行装饰(或说包装),利用这个特性,可以很方便、简洁地解决一些问题,比如获得函数执行时间的问题。
#26. 使用python装饰器计算函数运行时间的实例
装饰器 在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率今天就来见识一下python 装饰器,到底是怎么工作的。
#27. 使用python装饰器计算函数运行时间的实例
使用python装饰器 计算函数运行时间的实例,装饰器在python里面有很重要的作用,如果能够熟练使用,将会大大的提高工作效率今天就来见识一下python装饰 ...
#28. 無題
For full functionality of this site it is necessary to enable JavaScript. Here are the instructions how to enable JavaScript in your web browser.
#29. python装饰器何时执行?
python装饰器 ,使用python作为开发的小伙伴一定不会陌生,但是有没有思考过装饰器的执行原理及过程呢?下面我们来分析分析装饰器的特性及执行过程装饰 ...
#30. 函式引數· Introducing python - iampennywu
裝飾器 · 命名空間與範圍 · 使用try與except來處理錯誤 · 製作你自己的例外 · Chapter 5 ... 使用類別與物件V.S. 模組的時機 · Powered by GitBook · 函式引數. 函式. 要重複 ...
#31. Python class設計· parallel_processing
” 方法始終都是類的靜態方法(即第一個參數為cls),即使沒有被加上靜態方法裝飾器 ... 使用時機:跟Module private 一樣,就是表現出這些成員是內部使用的,不建議外界 ...
#32. typing --- 支援型別提示
因此, Annotated 不同于 @no_type_check 装饰器,后者虽然也可以用于在类型注解系统范围之外添加注解,但是会完全禁用对函数或类的类型检查。 具体解释元数据的方式由遇到 ...
#33. 简单地理解Python的装饰器 - 0xFEE1C001
用简单的方式轻松地理解Python的装饰器. ... 可以去掉 @ 语法糖分析下构造和调用的时机。 >>> @make_bold ... def get_content(): ... return 'hello world ...
#34. 深入理解Python中的装饰器及其应用 - 个人网络技术笔记
... 装饰器的执行时机、闭包的原理以及使用functools.wraps装饰器保留原函数元信息的方法。 9. 常见问题与解决方法. 在使用装饰器的过程中,我们可能会遇到 ...
#35. python 闭包和装饰器 - 草结笔记- 个人博客
闭包和装饰器整体思路采用“面向切面编程”的理念,用来实现一些辅助功能时非常好用,例如日志打印、时间计数、账户鉴权等。 本文将简单介绍原理,并结合几个简单案例说明。
#36. 撰寫管線裝飾專案- Azure DevOps
... decorator)'. 您可以開始查看此擴充點的強大功能。 使用目前作業的內容,在執行時間有條件地插入步驟。 使用YAML 運算式 來決定要插入和時機的步驟。
#37. Python装饰器(你想知道的这里都有)_CodeArts
1. 装饰器的定义 · 2. 装饰器的示例代码 · 3. 装饰器的语法糖写法 · 4. 装饰器的执行时机 · 5. 装饰器的使用 · 6. 通用装饰器的使用 · 7. 多个装饰器的使用 · 8.
#38. Python中如何使用装饰器
Python 中如何使用装饰器. news/2023/10/15 13:05:58. 01.什么是装饰器. 把一个函数当作参数,返回一个替代版的函数本质就是一个返回函数的函数 ... 文章目录PromisePromise状态Promise使用——then、 ...
#39. Python :: 共同行為與is a
物件導向中,子類別繼承(inherit)父類別,可避免重複的行為與實作定義,不過並非為了避免重複定義行為與實作就得使用繼承,濫用繼承而導致程式維護 ...
#40. 電腦資訊論壇
Python class 的使用時機 · 綜合討論 · python. 3, 713, 2022年09月22日. python無法安裝 ... python 實例方法裝飾器的型別註解問題 · 詢問. 1, 217, 2023年01月01日. 使用 ...
#41. 装饰器
装饰器 通过使用该参数来执行某些操作,然后返回原始参数或一些其他的调用(大. 概以这种方式与装饰器交互)。 由于函数在Python 中是一级对象,因此它们能够像其他对象一样被 ...
#42. fluent-python/07章-函数装饰器和闭包.md at master
Python 执行装饰器的时机. A key feature of decorators is that they run right ... 类似的装饰器被用在很多Python Web框架中,以便将函数加入到注册中心里,例如,映射 ...
#43. Python 測試入門- PyTest Fixture - 拾遺
這個被標記為fixture 的函數就負責在裡面做他需要做的工作,並且 return 物件供測試腳本調用。就這樣,一個用來回傳物件的函數、加上裝飾器,fixture 就 ...
#44. Python 3.7 技術手冊(電子書) - 林信良
涵蓋Python 3.0至3.7實用特性- 運用Type Hints增加程式可讀性與穩固性- 深入常用模組之應用與實作- 介紹asyncio模組與非同步設計- 包含裝飾器、meta類別實作等進階 ...
#45. Python Enum 枚舉教學:有條理管理常數集合的好工具
最後,使用 Enum 的時機還是需要權衡的,當然不是任何用到常數的場合都適合用 Enum 。我認為,只有你的程式設計到了重視可讀性與程式碼品質的階段時 ...
#46. Python
第十五話、while loop (II). 現在大家應該對while loop的使用有深刻的認識了。事實上while loop的強大跟使用時機最主要就在於不確定 ...
#47. 浅谈JS装饰器以及装饰器在TS中的使用方式 - 脚本之
类装饰器的运行时间是在 类定义后直接运行 。我们可以验证一下:. 运行后发现,在 class A 定义完成后立即就输出了 我是decorator 。
#48. flask 钩子,特殊装饰器
... 时机上的不同。 另外一个不同,才是本质的不同,被teardown_request装饰的函数必须接收一个 ... 使用teardown_request就足够了。 6. 总结. 处理第一个请求时,被 ...
#49. 2023 Python全攻略
超過40小時的內容,學習Python語法、程式邏輯、識別Python資料類別與使用時機,用正規表示式處理資料、處理文件系統、運用Python網路爬蟲、連結SQL資料庫、處理Excel ...
#50. 了解Python的dataclass():簡單、快速、安全的資料類別
dataclass() 的使用方式. 使用dataclass() 來定義資料類別非常簡單,只需要在類別定義前面加上@dataclass 裝飾器,並且指定該類別的屬性,就可以完成 ...
#51. 函数装饰器的作用与用法- 日记
... 装饰器1.函数装饰器是Python提供的一种增强函数功能的标记函数; 2.装饰器是可调用的函数对象,其参数是另一个函数(被装饰的函数); 我们可以使用修饰器 ...
#52. Python:Classes and object-oriented programming
靜態方法(static method) 則可在沒有建立物件下使用該方法; 使用裝飾器(@staticmethod) 建立靜態方法; 靜態方法不會傳遞物件做為第一個參數. '''circle ...
#53. 金融計算程式運用(一)【6】
使用裝飾器 (@staticmethod) 建立靜態方法; 靜態方法不會傳遞物件做為第一 ... ()開頭 __ ,且後面沒有雙底線命名之方法或變數,被視為私有(private). Python ...
#54. Design Pattern(3) - Decorator - jyt0532's Blog
... 使用的人必須知道有什麼strategy option跟現在apply了哪一個strategy(就是 ... Python 裝飾器. 理解Python 裝飾器看這一篇就夠了. 這篇文章漂亮的詮釋了 ...
#55. 良葛格
Python 的metaclass 並不難理解,使用的時機點與class decorator 也不同,class decroator 是用在type 實例已經建立、初始化後再作修飾,metaclass 則 ...
#56. Python高级编程: 9787302452850: [美]Luke Sneeringer ...
... 器31.1理解装饰器31.2装饰器语法41.3在何处使用装饰器61.4编写装饰器的理由61.5编写装饰器的时机71.5.1附加功能71.5.2数据的清理或添加71.5.3函数注册71.6编写装饰器71.6.
#57. Python 工匠案例、技巧與工程實踐
... 使用wrapt模塊助力裝飾器編寫221. 8.2 編程建議223. 8.2.1 瞭解裝飾器的本質優勢223. 8.2.2 使用類裝飾器替代元類225. 8.2.3 別弄混裝飾器和裝飾器模式226. 8.2.4 淺裝飾器 ...
#58. 如何理解python里的装饰器
或者是理解成python 留给二次开发的一个内置API。 一般是用回调和hook 方式实现的。
#59. Python 装饰式和偏函数| Sunday博客
并且logger装饰器可以是通用的,需要日志功能的地方,都可以使用logger装饰器,达到复用的目的。 ... 装饰器具有的一些能力,比如这里的统计函数执行时间。
#60. 深入讨论Python 装饰器
3. Python 装饰器方法的执行时机与顺序. Python 是解释执行的语言。做一个小实验,以上例子是先定义log 装饰器,而后再使用log 装饰器, ...
#61. 型態提示、重載與Optional
... 使用Optional取代並不適合,應該改用重載(overload)。畢竟當參數接受 ... Python的typing模組提供overload裝飾器,被裝飾的函式可以僅定義函式簽署 ...
#62. python高级语法之闭包和装饰器详解
3.1.2 装饰器的执行时机. 先说结论:在使用装饰器语法糖时,会先将该装饰器函数执行一遍。 def ...
#63. 你不知道的Python大杀器,装饰器中的多重使用方法!
Python 没有提供像Java 似的注解,但是提供了相比注解表达能力更加强大的装饰器。 例如Web 框架Flask 中的route 、errorhandler 和Python 自带的property ...
#64. Flask:在Python 装饰器中抛出异常是一个好的模式吗
这样,我们就可以在不修改原函数代码的情况下,添加额外的功能。 以下是一个示例展示了如何使用装饰器来记录函数的执行时间:. import time def timeit(func): def ...
#65. python等待10秒执行下一命令的方法 - 腾讯云
函数接口进程线程. 在某个Flask项目在做后端接口时需要设置超时响应,因为接口中使用爬虫请求了多个网站,响应时间时长时短。 ... Python教程| 如何使用装饰器. 2750. 游戏 ...
#66. Python技術者們練功: 老手帶路! 教你精通正宗Python程式
... Python應用程式第12章使用檔案系統12.1 os 和os.path 與pathlib之比較12.2 路徑和 ... 時機第18章套件18.1 什麼是套件18.2 套件的運作方式18.3 套件的具體範例18.4 __ ...
#67. Python装饰器(你想知道的这里都有)
... (Python范儿)。很多Pythoner不知道在哪儿使用它们,哪些区域里装饰器可以让代码更简洁。通过本文的学习让你理解并学会装饰器 ... 4、装饰器的执行时机. 当前 ...
#68. 【Python基礎】什麼是self?什麼是__init__?:看完文章馬上會用
self怎麼用!?五分鐘看完文章馬上會寫python。 至於__init__是什麼?不懂得一同看過來~.
#69. Python - 维基百科,自由的百科全书
修饰器(decorator)可用来修改一个函数、方法或类定义的任何可调用Python对象 ... Inkscape:开源的SVG矢量图形编辑器,使用Python用于插件。 Pitivi:用Python开发 ...
#70. Python 技術者們:練功!老手帶路教你精通正宗Python 程式
9.8 修飾器(Decorator) ○老手帶路:修飾器(decorator)的用途 第10章模組與變數 ... 17.10 使用特殊method的時機 第18章套件 18.1 什麼是套件 18.2 套件的運作方式
#71. 项目中发现python代码用了装饰器,上网搜了资料
装饰器 是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入 ... 用了多长时间,好吧,那么我们可以这样做: import time def foo ...
#72. 最全python装饰器的各种写法
装饰器 实现已有函数执行时间的统计 import time def decorator(func): ... 如何使用Python反转列表?有哪些方式?
#73. [Python物件導向]解析Python物件導向設計的3種類型方法 ...
Python 類別(Class)中沒有加任何裝飾詞(Decorator)的方法(Method),至少要 ... 使用空白或底線分隔單字,如下範例: #範例一class Cars: #範例二class ...
#74. Python 中的装饰器和闭包
装饰器 101 · Python 执行装饰器的时机 · 使用装饰器重构策略模式 · 变量作用域的规则 · 闭包(Closure) · nonlocal 修饰符 · 实现一个简单的装饰器 · 标准库中的 ...
#75. python裝飾器限制函數運行時間,超時退出
使用 Thread. # -*- coding: utf-8 -*- from threading import Thread import time class ...
#76. atexit — 程式關閉時回呼— 你所不知道的Python 標準函式庫 ...
Python atexit 套件用來註冊當程式結束時要執行的函式。被 ... 你可以從這個例子發現,先註冊後執行這件事情。 你也可以使用decorator 直接註冊一個函式:.
#77. 看板Python - Re: [問題] 初學@property之疑問 - 批踢踢實業坊
... 使用: @property 這個decorator 是在其他地方已經被定義了嗎: 不能理解為何可以直接使用這個語法糖 是的: 還有@property和@name.setter擺放位置的意義 ...
#78. Python 快速入門
... 裝飾器有這樣的用法即可。 未來在Django中會有大量使用到裝飾器的地方,讀者們至少要熟悉如何使用一個設計好的裝飾器來裝飾函式。 物件導向. 還記得 ...
#79. Python实践104-类的装饰器 - 自动化测试实践
... 装饰器不会; 对于某些单个类特定的用法来说,使用元类并不合适,这个时候是类装饰器大施拳脚的好时机. 类装饰器的语义. class A: pass A = foo(bar(A)) ...
#80. python函数装饰器- osc_m6qqd6pr的个人空间
python 执行装饰器时机(加载模块时). registry = [] #保存被装饰的函数的 ... 使用该装饰器:. @clock def snooze(seconds): time.sleep(seconds) ...
#81. Python小技巧:函式結果自動快取 - 台大計中
使用Python 標準函式庫中functools函式庫提供的lru_cache()函式,配合Function Decorator語法,就可以方便使用記憶機制將函式的計算結果快取起來,大幅加速 ...
#82. Python工匠|案例、技巧與開發實戰
它試圖告訴讀者:如何正確選擇和使用Python語言的各種特性,寫出執行速度 ... 全書共13章,分為五大部分:變數與基礎型態、程式語法、函式與裝飾詞 ...
#83. Python:最強入門ChatGPT助攻邁向數據科學之路-王者歸來
... 使用裝飾器的時機。程式實例 ch11_39_2.py:裝飾器函數的基本操作,這個程式將設計一個 upper( )裝飾器,這個程式除了將所輸入 ... 裝飾器(Decorator) 11-13 裝飾器(Decorator)
#84. Python面試題目與解答:邁向高薪之路 - 第 3-29 頁 - Google 圖書結果
... 使用裝飾器的時機。下列是裝飾器函數的基本操作,這個程式將設計一個 upper( )裝飾器,這個程式除了將所輸入字串改成大寫,同時也列出所裝飾的函數名稱,以及函數所傳遞的 ...
#85. Python最強入門邁向數據科學之路.王者歸來
... 使用裝飾器的時機。程式實例 ch11_39_2.py:裝飾器函數的基本操作,這個程式將設計一個 upper( )裝飾器,這個程式除了將所輸入字串改成大寫,同時也列出所裝飾的函數名稱 ...
#86. Python最強入門邁向頂尖高手之路:王者歸來
... 使用裝飾器的時機。程式實例 ch11_39_2.py:裝飾器函數的基本操作,這個程式將設計一個 upper( )裝飾器,這個程式除了將所輸入字串改成大寫,同時也列出所裝飾的函數名稱 ...
#87. 簡潔的Python|重構你的舊程式(電子書) - 第 165 頁 - Google 圖書結果
... 使用存有各個實例的字典。但是為了完整起見,我也要展示這種做法。關於描述器的其他注意事項接下來,我們要討論在適合使用描述器的情況下,它們可以用來 ... 器的其他注意事項.
#88. Python 3.7 技術手冊(電子書) - 第 4-41 頁 - Google 圖書結果
林信良. 4.3.4 型態提示的時機在可以為 Python 程式碼加註型態之後,接下來必須考量的是,何時應該使用 ... 器有辦法推斷而不用開發者宣告型態的地方,仍建議加上型態,就是這個 ...
#89. Python 3.9技術手冊(電子書) - 第 4-44 頁 - Google 圖書結果
林信良. 4.3.4 型態提示的時機知道如何為 Python 程式碼加註型態之後,接下來必須考量的是,何時應該使用 ... 器有辦法推斷而不用開發者宣告型態的地方,仍建議加上型態,就是 ...
#90. Python 3.5 技術手冊(電子書) - 第 14-1 頁 - Google 圖書結果
... 裝飾器的概念不同,要對類別使用裝飾器時,類別本身已經產生,也就是已經產生了 type 實例,然後才去裝飾類別的行為;meta 類別是直接介入 type 建構與初始化類別的過程,時機 ...
#91. [Python] *args 和**kwargs 是什麼?一次搞懂它們!
這種集大成的寫法通常會在裝飾器時使用,讓裝飾器可以接受參數數量不同的函式。 再談* 的其它用法. 我們可以在傳入引數時使用** 來拆解dict,那就不能用* ...
python裝飾器使用時機 在 看板Python - Re: [問題] 初學@property之疑問 - 批踢踢實業坊 的推薦與評價
※ 引述《ar0n77777 (property)》之銘言:
: 各位前輩好 新年快樂
: 這是關於《精通python》上的疑問
: 想請問 class 中 @property 的使用
: @property 這個 decorator 是在其他地方已經被定義了嗎
: 不能理解為何可以直接使用這個語法糖
是的
: 還有@property和@name.setter擺放位置的意義
:
: 另外就是不能理解property的實際功效和用途
: 麻煩各位了... 非常感謝!!
直接看 decorator 會很像 magic, 我們慢慢來
首先考慮這樣一個 class
class Duck:
def __init__(self, name):
self.name = name
這沒什麼好解釋的, 你可以很方便操作這個 attribute
>>> duck = Duck('Donald')
>>> duck.name
'Donald'
>>> duck.name = 'Daffy'
>>> duck.name
'Daffy'
但過了一陣子, 可能你需要在修改鴨子名字時, 同時做某些其他事情
例如確認名字一定是字串, 而且不能超過 100 字之類的
所以你就把 class 改寫成這樣
class Duck:
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
def set_name(self, name):
if not isinstance(name, str) or len(name) > 100:
raise ValueError(name)
self._name = name
然後叫大家用 get_name() 與 set_name(), 而不要用本來的 name
但是 1. 一定會有忘記的時候, 2. 原本有的程式都要重寫很麻煩
所以這裡就是 property 出場的時機
property 是一個內建的 Python 型別 (和 list set 等等類似)
但這個型別特別的地方是應用了一個叫 descriptor 的概念
要從實作細節講起會花一千字以上, 所以這裡就直接看範例與最後結果
class Duck:
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
def set_name(self, name):
if not isinstance(name, str) or len(name) > 100:
raise ValueError(name)
self._name = name
name = property(get_name, set_name)
在 Duck 上宣告叫 name 的 property, 然後把 get_name 與 set_name 傳給它
這個 property 在 Python 裡有四種被使用的方法
>>> duck.name # 取值
>>> duck.name = ... # 賦值
>>> del duck.name # 刪值
>>> help(duck.name) # 看文件
如果 duck.name 是一個正常普通的值 (例如最開始的那個版本)
上面動作會發生的事情很直觀, 你應該也知道
但是如果 name 是一個 descriptor, 則 Python 會去觸發它上面的對應 method
取值觸發 __get__, 賦值觸發 __set__, 其餘類推
所以當你取值時, 會發生這樣的事情:
1. 你呼叫 duck.name
2. Python 呼叫 duck.name.__get__() -> 會回傳一個值
3. Python 把這個值當作 duck.name 的回傳值, 把它送給你
賦值則是這樣:
1. 你把 'Duffy' 賦給 duck.name
2. Python 不會取代 duck.name, 而是呼叫 duck.name.__set__('Duffy')
回到 property, 這個 class 的實作大致包含下面這樣:
class property:
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget
# 後面都一樣所以略過
def __get__(self, obj):
return self.fget(obj)
# 其他實作差不多, 略過
所以當你呼叫 duck.name 時, 大致會發生這樣的事情
1. duck.name
2. duck.name.__get__()
3. Duck.name.__get__(duck) [#1]
4. Duck.name.fget(duck)
5. Duck.get_name(duck) 因為我們把 get_name 傳進去了
6. 得到結果
[#1]: 剛好前幾篇才提到, 呼叫 instance.method() 等於 Class.method(instance)
這邊的狀況類似 (有微妙的不同), Python 會自動轉換呼叫的格式
注意 5. 等同於 duck.get_name() 所以結果就等於呼叫 property 的第一參數
以上就是 property 的簡單原理
但是這樣寫起來還是有點麻煩, 而且更重要的是, 不直觀
當你想知道 duck.name 時, 會需要先發現 name 是一個 property
再根據 property 的引數知道對應傳進去的函式, 再去找函式實作, 不太方便
Decorator 就是想辦法把這個 property 呼叫變得更簡明
當你在一個 method 上加上 @property 時, 例如這樣:
class Duck:
# 略
@property
def name(self):
return self._name
Python 會做以下的事情:
1. 根據 method 名 (這裡就是 name) 用一個同名 property 替代掉
2. 被替代掉的函式就當作該 property 的 fget 引數
3. property 的 doc 引數就是原本 getter 的 docstring
類似地, property.setter 會把被裝飾的函式設成該 property 的 setter
所以下面的實作
class Duck:
@property
def name(self):
return self._name
@name.setter
def name(self, name): # 順帶一提其實這個函式叫什麼根本不重要
self._name = name
大致等於
class Duck:
def getname(self):
return self._name
# @property 的作用
name = property(fget=getname, doc=getname.__doc__)
del getname
def setname(self, value):
self._name = name
# @name.setter 的作用
name.fset = setname
del setname
實際上因為 decorator 本身可以在賦名之前就作用
所以可以取和 property 一樣的名字
但是要討論這個就又要一千字, 所以這裡就不講到那裡
如果有興趣的話可以自己當成未來課題慢慢研究
另外從上面可以看到, property class 還有一個 deleter 可以設
所以實際上也還有一個 @property.deleter, 只是比較不常用
甚至實務上其實最常見的實作也只會用到 getter 而已
當你用到 setter 其實常常就代表需要重構了
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1514825287.A.BEE.html
... <看更多>