账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    python的装饰器如果是一个类,流程和原理是怎样的?
    41
    0
    
    class Singleton:
    
        """
        单例类装饰器,可以用于想实现单例的任何类。注意,不能用于多线程环境。
        """
    
        def __init__(self, cls):
            """ 需要的参数是一个类 """
            self._cls = cls
    
        def Instance(self):
            """
            返回真正的实例
            """
            try:
                return self._instance
            except AttributeError:
                self._instance = self._cls()
                return self._instance
    
        def __call__(self):
            raise TypeError('Singletons must be accessed through `Instance()`.')
    
        def __instancecheck__(self, inst):
            return isinstance(inst, self._decorated)
    
    
    # 装饰器
    @Singleton
    class A:
        """一个需要单列模式的类"""
        def __init__(self):
            pass
    
        def display(self):
            return id(self)
    
    if __name__ == '__main__':
        s1 = A.Instance()
        s2 = A.Instance()
        print(s1, s1.display())
        print(s2, s2.display())
        print(s1 is s2)

    这是网上看到的单例模式实现,他的装饰器是一个类,但是我在网上看到的关于装饰器的都是函数,按照我的理解,如果装饰器是个函数的话,会将@下面的函数传入@的函数,@的函数回返回一个函数,这个函数回执行传入的函数,和一些其他的操作。但是如果@的是一个装饰器的话应该怎么理解呢,按这段代码看 A应该是传进了Singleton的__init__方法,但是调用又是A.Instance(),这是继承关系吗,还有__instancecheck__是干嘛的,self._decorated又是什么意思?实在无法理解

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 迊颩、榌舞 普通会员 1楼

      在Python中,装饰器是一种特殊类型的函数,它可以被应用于其他函数,以便在不修改原函数代码的情况下,增加新的功能或行为。装饰器的使用可以极大地提高代码的可读性和可维护性。

      装饰器的工作原理如下:

      1. 装饰器函数定义:在Python中,我们可以使用def关键字来定义一个装饰器函数。

      2. 装饰器函数体:装饰器函数的主体部分通常包含一个或多个函数调用,这些函数在被装饰之前会被执行。

      3. 装饰器函数返回值:装饰器函数返回一个可调用的对象,这个对象在被调用之前会被执行。

      4. 装饰器函数装饰原函数:装饰器函数通过在被装饰函数之前或之后调用自身的函数来装饰原函数。

      以下是一个简单的装饰器函数的例子:

      ```python def my_decorator(func): def wrapper(): print("Before function execution") func() print("After function execution") return wrapper

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

      say_hello() ```

      在这个例子中,my_decorator是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapperwrapper函数在被调用之前打印一条消息,然后调用原始函数,最后打印另一条消息。然后,@my_decorator语法将wrapper函数应用到say_hello函数上,这意味着在say_hello函数执行前后,都会打印出相应的消息。

      通过这种方式,我们可以在不修改原函数代码的情况下,增加新的功能或行为。装饰器的使用可以使代码更加模块化和易于维护。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部