精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python 中這七個類裝飾器技巧,裝飾類而不是方法!

開發
今天咱們聊聊Python中的類裝飾器,但不是常見的函數裝飾器哦,而是專門用來裝飾類的技巧!很多初學者可能只知道裝飾器可以修飾方法或函數,其實它還能“改造”整個類呢。

大家好!今天咱們聊聊Python中的類裝飾器,但不是常見的函數裝飾器哦,而是專門用來裝飾類的技巧!很多初學者可能只知道裝飾器可以修飾方法或函數,其實它還能“改造”整個類呢。比如給類動態添加屬性、實現單例模式、甚至優化日志系統等功能,都可以通過類裝飾器完成。接下來我會用7個小節詳細講解,從基礎到高級,手把手教你掌握這些技巧!

一、理解裝飾器的基本概念與作用

1. 裝飾器是什么?

裝飾器是Python中非常強大的工具,它允許我們在不修改原有代碼的情況下為函數或類添加額外的功能。比如,你想在函數執行前后打印日志,裝飾器就能輕松搞定!來看個簡單例子:

def my_decorator(func):
    def wrapper():
        print("執行前的操作")
        func()
        print("執行后的操作")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

輸出:

執行前的操作
Hello!
執行后的操作

裝飾器的核心就是“包裝”函數,讓它變得更強大。接下來,我們會深入學習如何用裝飾器來裝飾類,而不是方法哦!

二、使用類裝飾器的基本語法

1. 類裝飾器的定義與作用

類裝飾器其實很好理解!它本質上是一個帶有 __call__ 方法的類,可以用來“包裝”其他類。當一個類被裝飾時,裝飾器會攔截對這個類的所有實例化操作。舉個例子:

class MyDecorator:
    def __init__(self, cls):# 接收被裝飾的類
        self.cls = cls

    def __call__(self, *args, **kwargs):# 攔截實例化操作
        print("類裝飾器被調用了!")
        return self.cls(*args, **kwargs)

@MyDecorator  # 等價于 MyClass = MyDecorator(MyClass)
class MyClass:
    def __init__(self, name):
        self.name = name

obj = MyClass("Python")  # 輸出:類裝飾器被調用了!
print(obj.name)  # 輸出:Python

這段代碼展示了類裝飾器的基本結構和用法。簡單來說,裝飾器通過 __call__ 方法控制類的實例化過程。是不是很酷?

三、類裝飾器中__init__和__call__方法的使用技巧

1. 理解__init__和__call__的作用

在類裝飾器中,__init__用于初始化裝飾器本身的參數,而__call__則負責對被裝飾的類進行處理。兩者配合可以讓類裝飾器功能更強大!來看個例子:

class MyDecorator:
    def __init__(self, func):
        # 初始化時接收被裝飾的類
        self.func = func

    def __call__(self, *args, **kwargs):
        # 在這里可以修改類的行為
        print("裝飾器執行前的操作")
        instance = self.func(*args, **kwargs)  # 實例化被裝飾的類
        print("裝飾器執行后的操作")
        return instance


@MyDecorator
class MyClass:
    def __init__(self, name):
        self.name = name


obj = MyClass("Python")  # 輸出:裝飾器執行前的操作 裝飾器執行后的操作
print(obj.name)  # 輸出:Python

通過這段代碼,你可以清楚地看到裝飾器如何在類實例化前后添加額外邏輯!

四、如何通過類裝飾器添加屬性或方法

1. 類裝飾器可以輕松擴展類功能

有時候,我們希望在不修改原始類代碼的情況下,為類動態添加屬性或方法。這時候,類裝飾器就派上用場了!下面是一個簡單的例子:

class AddFeatures:
    def __init__(self, cls):
        self.cls = cls  # 接收被裝飾的類

    def __call__(self, *args, **kwargs):
        instance = self.cls(*args, **kwargs)  # 創建實例
        
        # 動態添加屬性
        instance.new_attribute = "我是新增的屬性"
        
        # 動態添加方法
        def new_method(self):
            return"我是新增的方法"
        
        instance.new_method = new_method.__get__(instance)  # 綁定方法到實例
        
        return instance


@AddFeatures
class MyClass:
    def __init__(self, name):
        self.name = name


obj = MyClass("測試")
print(obj.new_attribute)  # 輸出:我是新增的屬性
print(obj.new_method())  # 輸出:我是新增的方法

2. 這段代碼的工作原理

  • AddFeatures 是一個類裝飾器,它接收一個類作為參數。
  • 在 __call__ 方法中,我們創建了被裝飾類的實例。
  • 然后通過直接賦值的方式為實例添加了一個新屬性 new_attribute 和一個新方法 new_method。
  • 最后返回這個增強后的實例。

這種方式非常適合在開發中動態擴展類的功能,而無需修改原始類的定義!是不是很酷?

五、利用類裝飾器實現單例模式的設計

1. 單例模式是什么?

單例模式是一種設計模式,確保一個類只有一個實例,并提供全局訪問點。在 Python 中,我們可以通過類裝飾器來實現這一功能!

2. 使用類裝飾器實現單例模式

下面是一個簡單的例子,展示如何通過類裝飾器實現單例模式:

class Singleton:  # 定義一個類裝飾器
    def __init__(self, cls):
        self._cls = cls  # 保存被裝飾的類
        self._instance = None# 初始化實例為None

    def __call__(self, *args, **kwargs):# 每次調用類時觸發
        if self._instance isNone:  # 如果沒有創建過實例
            self._instance = self._cls(*args, **kwargs)  # 創建實例
        return self._instance  # 返回唯一實例


@Singleton  # 使用類裝飾器
class DatabaseConnection:
    def __init__(self, url):
        self.url = url

# 測試代碼
db1 = DatabaseConnection("http://example.com")
db2 = DatabaseConnection("http://test.com")

print(db1 is db2)  # 輸出:True
print(db1.url)  # 輸出:http://example.com

3. 代碼解析

  • Singleton 類是裝飾器,它會在第一次調用時創建類的實例,并保存下來。
  • 后續每次調用都會返回同一個實例,確保了單例模式的實現。

在實際開發中,這種技巧非常適合管理數據庫連接、配置文件等需要共享資源的場景!

六、高級技巧:動態修改類的行為與功能

1. 使用類裝飾器動態添加方法

類裝飾器可以用來動態地為類添加方法,而不需要直接修改類的定義。比如下面這個例子:

def add_method(cls):
    def new_method(self):
        return "This is a dynamically added method!"
    cls.dynamic_method = new_method  # 動態添加方法
    return cls

@add_method
class MyClass:
    pass

obj = MyClass()
print(obj.dynamic_method())  # 輸出: This is a dynamically added method!

通過類裝飾器,我們成功為 MyClass 添加了一個新方法 dynamic_method。

2. 修改類的屬性或行為

除了添加方法,類裝飾器還能修改類的屬性或行為。看這個例子:

def modify_class(cls):
    cls.modified_attribute = "Modified by decorator"
    return cls

@modify_class
class AnotherClass:
    original_attribute = "Original value"

print(AnotherClass.original_attribute)  # 輸出: Original value
print(AnotherClass.modified_attribute)  # 輸出: Modified by decorator

在這個例子中,我們用裝飾器給 AnotherClass 增加了一個新的屬性 modified_attribute。

3. 動態注入日志功能

高級一點的應用是為類注入日志功能,方便調試和監控:

import logging

def log_calls(cls):
    original_init = cls.__init__
    def new_init(self, *args, **kwargs):
        logging.info(f"Initializing {cls.__name__} with args={args}, kwargs={kwargs}")
        original_init(self, *args, **kwargs)
    cls.__init__ = new_init
    return cls

@log_calls
class LoggedClass:
    def __init__(self, value):
        self.value = value

logging.basicConfig(level=logging.INFO)
LoggedClass(42)  # 控制臺輸出: INFO:root:Initializing LoggedClass with args=(42,), kwargs={}

通過這個裝飾器,每次實例化 LoggedClass 時都會記錄日志,非常實用!

七、實戰案例:使用類裝飾器優化日志記錄系統

1. 類裝飾器實現日志記錄功能

在開發中,日志記錄是不可或缺的一部分。通過類裝飾器,我們可以優雅地為類添加日志功能。比如,當一個類被實例化或方法被調用時,自動記錄相關信息。

class LogDecorator:
    def __init__(self, cls):
        self.cls = cls

    def __call__(self, *args, **kwargs):
        print(f"Creating instance of {self.cls.__name__}")
        instance = self.cls(*args, **kwargs)
        return instance


@LogDecorator
class Calculator:
    def add(self, a, b):
        return a + b


calc = Calculator()  # 輸出: Creating instance of Calculator

2. 動態記錄方法調用

我們還可以進一步擴展類裝飾器,記錄類中每個方法的調用情況。

class MethodLogger:
    def __init__(self, cls):
        self.cls = cls
        self._wrap_methods()

    def _wrap_methods(self):
        for attr_name, attr_value in self.cls.__dict__.items():
            if callable(attr_value):
                setattr(self.cls, attr_name, self._log_and_call(attr_value))

    def _log_and_call(self, func):
        def wrapper(*args, **kwargs):
            print(f"Calling {func.__name__} with args: {args}, kwargs: {kwargs}")
            return func(*args, **kwargs)
        return wrapper

    def __call__(self, *args, **kwargs):
        return self.cls(*args, **kwargs)


@MethodLogger
class MathOperations:
    def add(self, a, b):
        return a + b

    def multiply(self, a, b):
        return a * b


math = MathOperations()
math.add(5, 3)  # 輸出: Calling add with args: (5, 3), kwargs: {}
math.multiply(4, 6)  # 輸出: Calling multiply with args: (4, 6), kwargs: {}

這種實戰技巧不僅可以幫助我們快速定位問題,還能讓代碼更加清晰、易維護!

責任編輯:趙寧寧 來源: 手把手PythonAI編程
相關推薦

2022-06-15 10:24:13

Pytho裝飾器代碼

2024-05-20 09:26:42

Python裝飾器函數

2020-11-17 09:10:44

裝飾器

2025-05-08 08:10:00

Python函數調用代碼

2022-09-07 10:20:05

Python裝飾類

2010-02-01 17:50:32

Python裝飾器

2024-11-06 16:13:00

Python單例模式

2023-02-07 07:47:52

Python裝飾器函數

2025-07-21 00:01:00

2025-01-10 08:38:16

2024-09-12 15:32:35

裝飾器Python

2021-04-11 08:21:20

Python@property裝飾器

2025-01-22 15:58:46

2022-10-24 07:31:53

Python編程裝飾器

2016-11-01 09:24:38

Python裝飾器

2022-09-19 23:04:08

Python裝飾器語言

2023-04-19 15:29:53

通信技巧Vue 3開發

2024-05-10 12:33:06

flask裝飾器

2024-03-12 10:02:31

Python內存編程

2025-07-01 09:46:30

點贊
收藏

51CTO技術棧公眾號

亚洲一区 中文字幕| 污片免费在线观看| 欧美jizzhd69巨大| 国产精品一区二区久久精品爱涩| 美女视频久久黄| 污免费在线观看| 污视频免费在线观看| 成人午夜电影小说| 欧美又大又粗又长| 精品无码人妻一区二区免费蜜桃| 成人在线观看免费播放| 成人欧美一区二区三区黑人麻豆| **亚洲第一综合导航网站| 免费视频一二三区| 欧美午夜18电影| 欧美性一二三区| 亚洲国产一二三精品无码| 精品人妻午夜一区二区三区四区| 亚洲国产黄色| 国产亚洲a∨片在线观看| www.com操| 性网站在线观看| 99re成人精品视频| 国产精品视频99| 免费一级片在线观看| 欧美挤奶吃奶水xxxxx| 欧美丝袜丝交足nylons| 免费日韩在线观看| 免费在线毛片| 国精产品一区一区三区mba视频| 欧美激情精品久久久久| 一道本在线观看| 国产精品一区二区三区四区在线观看| 亚洲第一综合色| 日韩一区二区三区高清| www黄色网址| 日韩精品欧美精品| 欧美国产日韩一区二区| 欧美aaa级片| 久久男人av| 91麻豆精品国产91久久久久| 尤物av无码色av无码| 麻豆视频在线免费观看| 久久女同互慰一区二区三区| 91在线在线观看| 精品国产乱子伦| 欧美色图麻豆| 精品国模在线视频| 手机看片福利视频| 国产精品玖玖玖在线资源| 欧美日本在线播放| 国产乱子夫妻xx黑人xyx真爽| 五月花成人网| 中文字幕日本乱码精品影院| 日本不卡一区二区三区视频| 亚洲av无码一区二区三区性色| 日产欧产美韩系列久久99| 久久久久国色av免费观看性色| 国产又黄又粗视频| 亚洲精品亚洲人成在线观看| 欧美区一区二区三区| 一本久道中文无码字幕av| 成人黄色动漫| 亚洲国产中文字幕在线视频综合| 最新中文字幕久久| 国产h在线观看| 久久综合色天天久久综合图片| 国产精品免费视频一区二区| 国产免费黄色大片| 美女性感视频久久| 国产久一一精品| 男人天堂av在线播放| 美女搞黄视频在线观看| 国产成人精品影视| 日韩一区二区三区观看| 999一区二区三区| 成人免费观看视频大全| 亚洲三级电影网站| 九九九热999| 懂色av蜜臀av粉嫩av分享吧| 欧美日韩亚洲一区| 欧美国产日韩一区二区| 国产污视频在线看| 在线日韩欧美| 91国语精品自产拍在线观看性色 | 日韩在线一卡二卡| 99国产**精品****| 久久人体大胆视频| 手机在线免费看片| 欧美一区视频| 欧美精品xxx| 午夜精品三级久久久有码| 亚洲私拍自拍| 欧洲亚洲妇女av| 国产真人无遮挡作爱免费视频| 人人精品人人爱| 国产综合在线观看视频| 99热这里只有精品在线观看| 国产传媒一区在线| 国产伦精品一区二区三区四区视频| 天堂中文在线看| 国产亚洲综合在线| 综合操久久久| 国产精品探花在线| 日韩欧美在线视频日韩欧美在线视频 | 在线观看视频中文字幕| 国产伦精品一区二区三区免费迷| 成人av男人的天堂| 撸视在线观看免费视频| 国产精品久久久久四虎| 国产资源第一页| 九色porny视频在线观看| 91久久精品一区二区二区| 亚洲国产精品三区| 粉嫩精品导航导航| 国产亚洲精品综合一区91| 国产97免费视频| 国产日韩欧美一区| 成人av.网址在线网站| 亚洲精华国产精华精华液网站| 99国产精品久久久久久久久久 | 国产极品久久久| 久久在线免费观看| 中文字幕日韩一区二区三区不卡| 国产盗摄一区二区| 欧美日韩一二三区| 久久久久久久人妻无码中文字幕爆| 国产欧美日韩| 欧美高清性猛交| 国产视频1区2区| 国产成人福利片| 四虎影视永久免费在线观看一区二区三区| 日韩精品卡一| 欧美三级电影在线看| 中文字幕在线播放一区| 欧美韩日一区| 4438全国亚洲精品在线观看视频| 国产精品人人爽| 久久综合九色综合97婷婷女人 | 欧美日韩调教| 国产日韩一区在线| 国产永久免费高清在线观看视频| 午夜视频一区在线观看| 一级日本黄色片| 欧美日韩有码| 日本久久久久久久久| 性中国古装videossex| 国产精品免费视频一区| 97av视频在线观看| 国产伦精品一区二区三区在线播放 | 91在线视频免费观看| 黑人巨茎大战欧美白妇| 久久av影院| 一个色综合导航| 午夜精品三级久久久有码| 成人激情小说网站| 韩国无码av片在线观看网站| 国产精品日本一区二区三区在线 | 免费成人高清在线视频theav| 91成人看片| 久久久久www| 中文字幕日韩三级| 国产欧美一区二区在线| 丝袜老师办公室里做好紧好爽 | 欧美日韩在线播放视频| 日本久久久久久久久久久| 四虎成人免费在线| 天天色天天操综合| 国产精品福利导航| 国产婷婷精品| 久久精品国产第一区二区三区最新章节| 欧美v亚洲v| 欧美成人a视频| 加勒比av在线播放| 国产成人精品午夜视频免费| 超薄肉色丝袜足j调教99| 羞羞视频在线观看一区二区| 色悠悠国产精品| 在线视频欧美亚洲| 亚洲欧洲日产国码二区| 日韩av加勒比| 你懂的成人av| 国产在线精品一区二区三区》| 国精产品一区一区三区mba下载| 精品国产一区二区三区四区四| 欧美精品乱码视频一二专区| 豆国产96在线|亚洲| 91九色丨porny丨国产jk| 欧美18xxxx| 国产精品91久久久| 黄网站在线免费| 日韩女优毛片在线| 91porny在线| 国产欧美精品一区二区色综合| 一区二区三区视频在线观看免费| 99欧美视频| 91久久精品一区二区别| а√在线中文网新版地址在线| 亚洲免费精彩视频| 亚洲图片欧美在线| 夜夜嗨av一区二区三区中文字幕| 丰满人妻一区二区三区免费视频棣| 亚洲毛片在线| 亚洲韩国在线| 日韩在线精品强乱中文字幕| 91精品国产色综合久久不卡98| 九色视频在线播放| 91精品国产综合久久婷婷香蕉| 久久久久香蕉视频| 久久久久国产精品人| 亚洲高清免费在线观看| 亚洲天堂久久| 日本最新一区二区三区视频观看| 在线观看欧美| 91av视频导航| 麻豆免费在线观看| 日韩精品免费在线视频| 夜夜躁狠狠躁日日躁av| 亚洲国产裸拍裸体视频在线观看乱了| wwwwww日本| 国产一区二区三区四| 国产一区二区三区精彩视频 | 中文字幕av网址| 免费人成精品欧美精品| 青春草国产视频| 久久伦理在线| 久久久婷婷一区二区三区不卡| 国产亚洲人成a在线v网站| 91精品国产色综合久久不卡98| 成人在线直播| 亚洲视频一区二区| 国产成人手机在线| 欧美男生操女生| 一级黄色大片视频| 亚洲一区二区偷拍精品| 亚洲 欧美 国产 另类| 91在线视频观看| 亚洲国产欧美日韩在线| 日本中文字幕一区二区有限公司| 少妇av一区二区三区无码| 亚洲最新色图| 午夜视频久久久| 日韩在线麻豆| 成人高清在线观看| 小说区图片区亚洲| 国产精品久久久久久一区二区| 爱啪啪综合导航| 中文字幕在线成人| 你懂的视频在线观看| 欧美精品一区二区三区高清aⅴ | av电影在线网| 亚洲欧美日韩综合| 手机在线精品视频| 日韩视频在线永久播放| 91精品国产综合久| 欧美日韩亚洲高清一区二区| 九九热最新视频| 日韩欧美福利视频| 精品美女久久久久| 亚洲成国产人片在线观看| 亚洲天堂黄色片| 最新欧美精品一区二区三区| 国产免费嫩草影院| 亚洲国产精品二十页| 欧美老熟妇乱大交xxxxx| 99久久婷婷国产综合精品 | 粉嫩av一区二区三区四区五区| 秋霞av国产精品一区| 中文日产幕无线码一区二区| 性日韩欧美在线视频| 免费在线国产视频| 韩国精品久久久999| 国产va在线视频| 51精品在线观看| 亚洲女同志freevdieo| 欧美亚洲在线视频| 韩日成人影院| 国产精品久久久久福利| 黄色成人在线视频| 国产原创欧美精品| 精品一区二区三区中文字幕| 亚洲在线免费观看| 国产精品17p| 久久综合精品一区| av一区二区高清| 亚洲一区3d动漫同人无遮挡 | x88av在线| 色资源二区在线视频| 黄色免费大全亚洲| 99c视频在线| 精品精品国产三级a∨在线| 黄色99视频| 国产欧美一区| 国产系列第一页| 亚洲无吗在线| 欧美日韩国产精品激情在线播放| 肉丝袜脚交视频一区二区| 免费看涩涩视频| 国产福利一区二区三区在线视频| 国产69视频在线观看| 久久在线观看免费| 99热这里只有精品4| 亚洲一区二区三区四区中文字幕| 亚洲 欧美 日韩 综合| 91福利在线观看| 国产男男gay体育生白袜| 亚洲国产精久久久久久久| 亚洲第一精品网站| 日韩高清av一区二区三区| 岛国最新视频免费在线观看| 在线播放国产一区中文字幕剧情欧美| www在线视频| 欧美性资源免费| 欧洲美女精品免费观看视频| 国产日韩欧美综合精品| 第一会所sis001亚洲| 男人天堂手机在线视频| 日本亚洲欧美天堂免费| 国产麻豆剧传媒精品国产| 久久久亚洲高清| 91成人福利视频| 欧美在线不卡一区| 人妻精品无码一区二区| 日韩亚洲成人av在线| av资源网在线播放| 国产在线视频欧美| 日韩美女精品| 无码人妻aⅴ一区二区三区日本| 亚洲一区激情| 天美一区二区三区| 国产天堂亚洲国产碰碰| 久久99久久98精品免观看软件| 欧美手机在线视频| 亚洲av成人无码网天堂| 欧美成人网在线| а√天堂资源国产精品| 黑人巨大精品欧美一区二区小视频 | 久久99高清| www.国产在线视频| 国产一区二区日韩精品| 91精品久久久久久久久久久久| 精品久久香蕉国产线看观看亚洲| 国产精品无码久久久久成人app| 亚洲区中文字幕| 麻豆蜜桃在线观看| 98国产高清一区| 91精品99| 色噜噜狠狠一区二区| 国产日韩欧美麻豆| caoporn国产| 精品无人国产偷自产在线| 激情图片在线观看高清国产| 亚洲a成v人在线观看| 日韩精品看片| 天天操天天爱天天爽| 久久久久亚洲蜜桃| 国产婷婷色一区二区在线观看| 亚洲二区在线播放视频| 18视频在线观看网站| 国产精品亚洲美女av网站| 啪啪亚洲精品| 成年人在线看片| 久久人人超碰精品| 国产女主播喷水视频在线观看 | 日韩中文在线不卡| 99久久综合国产精品二区| 日韩av高清| 日本美女一区二区三区| 永久免费观看片现看| 欧美亚洲一区三区| 77导航福利在线| 国产精品视频一区二区三区四| 欧美精品尤物在线观看| 国产精品天天av精麻传媒| 久久毛片高清国产| 无码人妻丰满熟妇奶水区码| 亚洲品质视频自拍网| 日韩一级二级 | 欧美色爱综合| 午夜免费一区二区| 久久中文娱乐网| 小泽玛利亚一区二区三区视频| 色婷婷成人综合| 国产不卡精品| 国产 国语对白 露脸| 成人手机电影网| 69视频免费在线观看| 亚洲精品少妇网址| 国产精品久久久久77777丨| 国产一区二区四区| 国产精品乱人伦| 成人午夜福利视频| 国产成人一区二区三区| 欧美福利网址| 成年人网站免费在线观看| 欧美精品丝袜久久久中文字幕| 国产伦理精品| 国产又爽又黄ai换脸| av成人老司机| 99国产精品欲|