- 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 条
- 全部回答
-
迊颩、榌舞 普通会员 1楼
在Python中,装饰器是一种特殊类型的函数,它可以被应用于其他函数,以便在不修改原函数代码的情况下,增加新的功能或行为。装饰器的使用可以极大地提高代码的可读性和可维护性。
装饰器的工作原理如下:
-
装饰器函数定义:在Python中,我们可以使用def关键字来定义一个装饰器函数。
-
装饰器函数体:装饰器函数的主体部分通常包含一个或多个函数调用,这些函数在被装饰之前会被执行。
-
装饰器函数返回值:装饰器函数返回一个可调用的对象,这个对象在被调用之前会被执行。
-
装饰器函数装饰原函数:装饰器函数通过在被装饰函数之前或之后调用自身的函数来装饰原函数。
以下是一个简单的装饰器函数的例子:
```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是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数wrapper。wrapper函数在被调用之前打印一条消息,然后调用原始函数,最后打印另一条消息。然后,@my_decorator语法将wrapper函数应用到say_hello函数上,这意味着在say_hello函数执行前后,都会打印出相应的消息。通过这种方式,我们可以在不修改原函数代码的情况下,增加新的功能或行为。装饰器的使用可以使代码更加模块化和易于维护。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
