網站首頁 編程語言 正文
1.定義及使用
例1:裝飾器定義:
? ? ? def 裝飾器函數(外部函數):
? ? ? ? ? ? def 內聯函數(*args,**kwargs):
? ? ? ? ? ? ? ? ...前置裝飾...
? ? ? ? ? ? ? ? 外部函數(*args,**kwargs)
? ? ? ? ? ? ? ? ...后置裝飾...
? ? ? ? ? ? return 內聯函數
?例2:裝飾器兩種調用方式
- ?第一種:裝飾器函數(外部函數)(參數1,參數2......)
- ?第二種:定義時通過 @裝飾器函數名 綁定 外部函數(外部函數調用時觸發)
# coding:utf-8: if __name__ == '__main__': ? ? # 例1 裝飾器定義 ? ? # 裝飾器函數 外部函數func ? ? def decorator(func): ? ? ? ? # 內聯函數 進行裝飾 ? ? ? ? # *args 將 參數1,參數2...... 變為 (參數1,參數2.......) ? ? ? ? # **kwargs 將 參數3=參數值3,參數4=參數值4...... 變為 {'參數3':參數值3,'參數4':'參數值4'......} ? ? ? ? # *args,**kwargs 將 參數1,參數2......參數3=參數值3,參數4=參數值4...... 變為 (參數1,參數2.......),{'參數3':參數值3,'參數4':'參數值4'......} ? ? ? ? def inline(*args, **kwargs): ? ? ? ? ? ? # *args,**kwargs 將參數還原 ? ? ? ? ? ? # 將 (參數1,參數2.......),{'參數3':參數值3,'參數4':'參數值4'......} 變為 參數1,參數2......參數3=參數值3,參數4=參數值4...... ? ? ? ? ? ? name = func(*args, **kwargs) ? ? ? ? ? ? print(f'name is {name}') ? ? ? ? # return 內聯函數 ? ? ? ? return inline ? ? def talk(name): ? ? ? ? return name ? ? # 例2 裝飾器的兩種調用方式 ? ? # 第一種 裝飾器函數(外部函數)(參數1,參數2......) ? ? decorator(talk)('xie') ?# name is xie ? ? # 第二種 @裝飾器函數名 綁定 外部函數 ? ? @decorator ? ? def see(name): ? ? ? ? return name ? ? # 調用時觸發裝飾器 ? ? see('xie') ?# name is xie
2.@classmethod
- ? 1.被
@classmethod
裝飾的類方法可以通過class.方法(參數1,參數2......)調用 - ? ? 2.但是定義函數時 self 需要變成 cls
- ? ? 3.其內部不能調用類的普通方法(無裝飾器修飾的方法),可以調用
@classmethod
,@staticmethod
裝飾的方法 - ? ? 4.能訪問類的屬性?
- ? ? 5.普通類中能通過self調用@classmethod裝飾的方法
# coding:utf-8: if __name__ == '__main__': ? ? class A(object): ? ? ? ? __name = 'python' ? ? ? ? # 普通方法 ? ? ? ? def talk(self): ? ? ? ? ? ? print(self.__name) ? ? ? ? ? ? # self.see() 普通類中能通過self調用@classmethod裝飾的方法 ? ? ? ? # 被@classmethod裝飾的類方法可以通過class.方法(參數1,參數2......)調用 ? ? ? ? # 但是定義函數時 self 需要變成 cls ? ? ? ? @classmethod ? ? ? ? def see(cls, description='good'): ? ? ? ? ? ? # cls.talk() Error 不能調用類的普通方法(非@classmethod,@staticmethod修飾的方法) ? ? ? ? ? ? # cls.look() 可以調用@classmethod裝飾的方法 ? ? ? ? ? ? # cls.jump() 可以調用@staticmethod裝飾的方法 ? ? ? ? ? ? # 能訪問類的屬性 ? ? ? ? ? ? print(f'{cls .__name} is {description}') ? ? ? ? @classmethod ? ? ? ? def look(cls): ? ? ? ? ? ? print(f'I like {cls.__name}') ? ? ? ? @staticmethod ? ? ? ? def jump(): ? ? ? ? ? ? print(f'I am jump') ? ? a = A() ? ? a.talk() ?# python ? ? # A.talk() Error 不能通過class.方法(參數1,參數2......)調用 ? ? a.see() ?# python is good ? ? # 通過class.方法(參數1,參數2......)調用 ? ? A.see() ?# python is good
@staticmethod
- ? ?1. 被@staticmethod裝飾的類方法可以通過class.方法(參數1,參數2......)調用
- ? ? 2. 但是定義函數時 無須self和cls
- ? ? 3. 由于其無self,cls注定其無法訪問類屬性&調用類方法
- ? ? 4. 在類的普通方法中可以通過self調用@staticmethod裝飾的方法
# coding:utf-8: if __name__ == '__main__': ? ? ''' ? ? ? ''' ? ? class B(object): ? ? ? ? __name = 'php' ? ? ? ? def talk(self): ? ? ? ? ? ? # 可以通過self調用@staticmethod裝飾的方法 ? ? ? ? ? ? self.see(self.__name) ? ? ? ? # 無須self,cls ? ? ? ? @staticmethod ? ? ? ? def see(description='good'): ? ? ? ? ? ? print(f'description is {description}') ? ? B.see() ?# description is good ? ? B.see('ok') ?# description is ok ? ? B().talk() ?# description is php
@property
- 1.@property裝飾的函數被用來代替類中與函數名相同的屬性
? ? ? 定義: @property
? ? ? ? ? ? def 屬性名(self):
? ? ? ? ? ? ? ? .......
- ? 2.被@property裝飾器代替的屬性,無法通過object.屬性名=屬性值進行賦值(除非使用了@屬性名.setter裝飾器):
? ? ? 定義: @屬性名.setter
? ? ? ? ? ? def 屬性名(self,屬性值):
? ? ? ? ? ? ? ? ...... ?
- 3.被@property修飾的函數不能在外部通過object.函數名()調用,只能object.函數名 當做屬性
- 4.只有被@property代替了的屬性才能使用@屬性名.setter 裝飾器
- 5. __setattr__ 的優先級高于 @屬性名.setter裝飾器的優先級
# coding:utf-8: if __name__ == '__main__': ? ? ''' ? ? ? ? ''' ? ? class A(object): ? ? ? ? __name = 'python' ? ? ? ? sex = 'man' ? ? ? ? # 不能設置成私有 ? ? ? ? # @property裝飾的函數被用來代替類中與函數名相同的屬性 ? ? ? ? # 這個代替了name屬性 ? ? ? ? @property ? ? ? ? def name(self): ? ? ? ? ? ? return self.__name
@property
def sex(self): ? ? ? ? ? ? return 'woman' ? ? ? ? # 解決被替代屬性的 object.屬性=屬性值 賦值問題 ? ? ? ? # 配合@property裝飾器使用,只有被@property代替了的屬性才能使用@屬性名.setter 裝飾器 ? ? ? ? @name.setter ? ? ? ? def name(self, value): ? ? ? ? ? ? print(f'value is {value}') ? ? ? ? # __setattr__ 的優先級高于 @屬性名.setter裝飾器的優先級 ? ? ? ? # def __setattr__(self, key, value): ? ? ? ? # ? ? print(f'key is {key}, value is {value}') ? ? a = A() ? ? print(a.name) ?# python ? ? # print(a.name()) Error 被@property修飾的函數不能在外部通過object.函數名()調用,只能object.函數名 當做屬性 ? ? # 被@property代替了 ? ? print(a.sex) ?# 是 woman 不是 man ? ? # a.sex = 'man' Error 被代替的屬性,不能通過object.屬性名 = 屬性值 進行賦值,除非有@屬性名.setter裝飾 ? ? a.name = 'python3.7' ?# value is python3.7
原文鏈接:https://blog.csdn.net/qq_29744347/article/details/122982132
相關推薦
- 2022-10-30 詳解Objective?C?中Block如何捕獲外部值_IOS
- 2022-08-20 C#使用對象序列化類庫MessasgePack_C#教程
- 2022-12-15 python將二維數組升為一維數組或二維降為一維方法實例_python
- 2023-03-16 Android虛擬機Dalvik和ART科普_Android
- 2022-05-11 log4j2.xml 的標簽 loggers 中 root 的屬性 level 指的是什么
- 2022-04-16 c語言?數據存儲與原碼?反碼?補碼詳細解析_C 語言
- 2022-11-16 Python數據分析之matplotlib繪圖詳解_python
- 2022-10-22 python?中的?super詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支