在类python3中使用装饰器

时间:2019-05-05 11:53:23

标签: python python-3.x decorator python-decorators

请帮助您了解如何在类中正确使用装饰器。 例如,我想在执行类之前检查变量,以及是否存在使用该变量运行的类。 该怎么做?

我的无效示例:

<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()

1 个答案:

答案 0 :(得分:1)

您应该阅读有关装饰器的更多信息,也许检查PEP 3129PEP 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中,函数foobar被显式调用以修改初始类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)

请注意,如果设置了环境变量(满意的代码路径),这将从装饰器返回原始类,否则终止执行(因此无需从装饰器返回任何内容)。