请帮助您了解如何在类中正确使用装饰器。 例如,我想在执行类之前检查变量,以及是否存在使用该变量运行的类。 该怎么做?
我的无效示例:
<configuration>
<from>
<image>gcr.io/distroless/java</image>
</from>
</configuration>
我的错误:
import os,sys
import requests
def checkCredentials(function):
KEY = os.environ['KEY']
if KEY:
print("exist")
return KEY
else:
print("nope")
sys.exit(0)
@checkCredentials
class StartUp(object):
def __init__(self, argument1):
self.argument1 = argument1
def printstr(self):
print(self.argument1)
if __name__ == '__main__':
start = StartUp()
答案 0 :(得分:1)
您应该阅读有关装饰器的更多信息,也许检查PEP 3129或PEP 318。以下来自前PEP的示例说明了类装饰器的语义:
# Solution 1: Without class decorators
class A:
pass
A = foo(bar(A))
# Solution 2: With class decorators
@foo
@bar
class A:
pass
两个解决方案产生相同的结果。在Solution 1
中,函数foo
和bar
被显式调用以修改初始类A
并产生修改后的变体。通过使用装饰器,可以更清楚地实现相同的效果:这就是Solution 2
。
让我们将其应用于您的代码示例。您的最后一行代码是
start = StartUp()
翻译为
start = checkCredentials(StartUp)()
但是,checkCredentials
不返回任何内容或返回str
,因此返回TypeError
。我不确定您要使用装饰器实现什么目标。如果您只想测试特定环境变量的存在,则以下装饰器可能会产生所需的效果:
def checkCredentials(cls):
KEY = os.environ['KEY']
if KEY:
print("exist")
return cls
else:
print("nope")
sys.exit(0)
请注意,如果设置了环境变量(满意的代码路径),这将从装饰器返回原始类,否则终止执行(因此无需从装饰器返回任何内容)。