装饰器的种类以及它的一些用法

前言:

这一篇博客其实主要是为了给大家拓展一下,因为这篇的内容对后面我给大家分享的一个非常有趣的一个编程游戏有关.在这篇我先写后面要用到的一点知识点.因为后面的游戏是关于面向对象的一个小游戏,但是可能涉及到知识点比较多,不过我会尽量把这些知识点给大家分享出来.同时也希望大家能给我更多的鼓励.小编在这里谢谢大家!

1.装饰器(Decorator):

装饰器(Decorator)是Python中一个非常强大且灵活的设计模式,它允许用户在不修改函数或类原有代码的基础上,给函数或类动态地添加额外的功能。装饰器本质上是一个函数或类,它接受一个函数或类作为输入,并返回一个新的函数或类作为输出

装饰器使用@符号来表示,必须放在单独的行上并且位于对应的函数或类之前。装饰器函数或类的返回值通常是一个函数或类的实例,这个函数或类实例会“包装”或“装饰”原始的函数或类,以提供额外的功能

1.1装饰器有两种主要类型:函数装饰器和类装饰器

1.1.1函数装饰器:

函数装饰器(Function Decorator)是Python中一种高级功能,它允许你在不修改函数内部代码的情况下,为函数添加额外的功能。装饰器本质上是一个可调用的对象(通常是一个函数),它接受一个函数作为参数,并返回一个新的函数作为结果,同时函数装饰器是最常见的装饰器类型,它接受一个函数作为输入,并返回一个新的函数作为输出.这个新的函数通常会调用原始函数,并在调用前后添加一些额外的逻辑

装饰器的基本语法是在函数定义之前,使用 @ 符号加上装饰器的名称来应用装饰器这是一个例子:

def my_decorator(func):  
    def wrapper():  
        print("Before function call")  
        func()  
        print("After function call")  
    return wrapper  
  
@my_decorator  
def say_hello():  
    print("Hello!")  
  
# 调用 say_hello 函数时,会先执行 my_decorator 装饰器中的代码  
say_hello()

在这个例子中,my_decorator 是一个装饰器,它接受一个函数作为参数(在这个例子中是 say_hello),并返回一个新的函数 wrapper.wrapper 函数在调用 say_hello 函数之前和之后分别打印一些信息。通过使用 @my_decorator,我们可以在不修改 say_hello 函数代码的情况下,为其添加额外的功能.

需要注意的是,装饰器返回的函数(在这个例子中是 wrapper)应该与原始函数具有相同的签名(即参数类型和数量应该相同),以确保在调用时能够正确地传递参数.

此外,装饰器还可以接受可变参数和关键字参数,以便处理更复杂的函数签名.同时,装饰器也可以嵌套使用,即一个装饰器可以装饰另一个装饰器,以实现更复杂的功能组合.

 

1.1.1.1使用装饰器的好处包括:
  1. 代码重用:可以在多个函数之间重用相同的装饰器,避免代码重复
  2. 逻辑分离:装饰器可以将核心逻辑和辅助逻辑分离,使代码更加清晰易读.
  3. 动态修改函数行为:装饰器可以在运行时动态修改函数的行为,这在调试、性能分析、权限校验等场景中非常有用.

1.1.2类装饰器(Class Decorator):

类装饰器是应用于类定义的装饰器。它们可以修改类的行为、属性或方法。与函数装饰器类似,类装饰器以一个类作为输入,并返回一个修改后的类作为输出 .它允许你使用类来实现装饰器的功能。类装饰器的工作方式与函数装饰器类似,但它们的实现方式有所不同.类装饰器通常定义了一个类,并在实例化这个类时传入一个函数作为参数,然后这个类返回一个修改后的函数

 这是类装饰器的一个例子

class MyDecorator:  
    def __init__(self, func):  
        self.func = func  
  
    def __call__(self, *args, **kwargs):  
        print("Before function call")  
        result = self.func(*args, **kwargs)  
        print("After function call")  
        return result  
  
@MyDecorator  
def say_hello():  
    print("Hello!")  
  
# 调用 say_hello 函数时,会先执行 MyDecorator 类中的代码  
say_hello()

在这个例子中,MyDecorator 是一个类装饰器。当我们使用 @MyDecorator 修饰 say_hello 函数时,Python 会创建一个 MyDecorator 类的实例,并将 say_hello 函数作为参数传递给 __init__ 方法。然后,当 say_hello 被调用时,实际上会调用 MyDecorator 实例的 __call__ 方法。

__call__ 方法是一个特殊的方法,它允许类的实例像函数一样被调用。在这个方法中,我们可以添加任何我们想在原始函数调用之前或之后执行的代码。在这个例子中,我们在调用 say_hello 之前和之后打印了一些信息。

类装饰器的一个常见用途是实现带有参数的装饰器。由于函数装饰器在定义时就固定了所装饰的函数,如果需要在运行时传递参数给装饰器,类装饰器是一个更好的选择

1.1.2.1类装饰器优点:
  1. 封装性:类装饰器允许将相关的方法和数据封装在一个类中,这使得代码更加模块化和易于维护。通过封装,你可以隐藏实现细节,只暴露必要的接口,使得装饰器的使用更加简洁和直观。

  2. 灵活性:类装饰器提供了更大的灵活性,因为你可以利用类的继承和多态等特性来扩展和定制装饰器的功能。通过继承,你可以创建一个基础装饰器类,并在此基础上创建特定的装饰器类,实现代码的重用和扩展。

  3. 状态管理:类装饰器可以使用实例变量来保存状态,这使得装饰器能够在函数调用之间保持状态信息。这对于需要追踪函数调用次数、缓存结果等场景非常有用。通过状态管理,你可以实现更复杂的逻辑和行为。

  4. 参数化:类装饰器可以方便地实现带参数的装饰器。你可以在创建装饰器实例时传递参数,这些参数可以在装饰器的逻辑中使用。这使得类装饰器更加灵活和可配置,能够适应不同的需求。

  5. 链式调用和组合:类装饰器支持链式调用和组合,这意味着你可以将多个装饰器组合在一起,形成一个装饰器链。这种机制允许你以声明式的方式组合多个装饰器的功能,从而实现更复杂的功能组合

是它们可以存储额外的状态信息,因为它们是类的实例。这使得类装饰器在处理需要维护状态或具有复杂逻辑的场景时非常有用

2.绑定方法和非绑定方法

绑定方法和非绑定方法与面向对象编程(OOP)紧密相关.在面向对象编程中,类(Class)是对象的蓝图或模板,而对象(Object)是类的实例.类定义了对象的属性和方法,这些方法可以是绑定方法或非绑定方法.在Python中,方法(或函数)可以被绑定到类的实例或类本身.根据方法的绑定状态,我们可以将它们分为绑定方法(Bound Method)和非绑定方法(Unbound Method)或称为实例方法和类方法。以下是它们的详细解释:

2.1绑定方法(Bound Method)

2.1.1当一个方法被类的实例调用时,它被称为绑定方法.

2.1.2在绑定方法中,第一个参数(通常是self)自动绑定到类的实例上.这意味着当你调用该方法时,Python知道你是在哪个实例上调用它.

2.1.3例如,如果你有一个名为MyClass的类,并且该类有一个名为my_method的方法,那么my_instance.my_method()会调用一个绑定方法,其中my_instanceMyClass的一个实例

class MyClass:  
    def my_method(self, other_args):  
        # 在这里,self 是 MyClass 的一个实例  
        pass  
  
my_instance = MyClass()  
my_instance.my_method()  # 调用绑定方法

2.1非绑定方法(Unbound Method)

非绑定方法通常与类而不是实例相关联,在Python 2中,类方法被称为非绑定方法.

非绑定方法没有绑定到类的任何特定实例,但它们仍然需要接收类作为第一个参数(通常是class).

你可以通过类名来调用非绑定方法,而不是通过实例.

在Python 3中,非绑定方法通常使用@classmethod装饰器来定义

结语:由于时间关系今天就先写到这里,从明天开始,我将会教大家去写一个关于面向对象的小游戏,一天肯定是写不完的,不过我会尽量去教会大家如何在Pycharm中写游戏的代码

 

                                                                                                                                            

  • 32
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yz_518 Nemo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值