静态方法作为没有实例化的属性

时间:2021-03-02 18:11:14

标签: python python-3.x oop

我有一个 class 用于保存一堆 python 静态方法,这些方法将从环境变量中返回一个字符串。

class GitLabCiEnv():
    """
    Gitlab CI Environment variables.
    """
    @staticmethod
    def CHAT_CHANNEL() -> str:
        """
        Source chat channel which triggered the ChatOps command.

        Added in GitLab 10.6
        Available in GitLab Runner all
        """
        return os.environ["CHAT_CHANNEL"]

    @staticmethod
    def CHAT_INPUT() -> str:
        """
        Additional arguments passed in the ChatOps command.

        Added in GitLab 10.6
        Available in GitLab Runner all
        """
        return os.environ["CHAT_INPUT"]

有了这个 class,我可以调用 GitLabCiEnv.CHAT_CHANNEL() 来获取环境变量的值。 “丑陋”是,我必须为每个 @staticmethod 使用括号。 我会做的是不带括号的 GitLabCiEnv.CHAT_CHANNEL

我不想实例化这个类的对象,在我看来,拥有一个对象没有任何好处。 我尝试了不同的实现,使用类变量,但是如果导入类,每个变量都会被初始化,这不是我想要的。

也许有人为我提供了解决方案。

非常感谢!

1 个答案:

答案 0 :(得分:3)

这可能不应该是一个类。但如果你真的想要这个,只需创建一个自定义描述符:

import os

class EnvProxy:
    def __init__(self, key):
        self.key = key
    def __get__(self, obj, objtype=None):
        return os.environ[self.key]

class GitLabCiEnv:
    CHAT_CHANNEL = EnvProxy("CHAT_CHANNEL")
    CHAT_INPUT = EnvProxy("CHAT_INPUT")

示例:

(py38) juanarrivillaga@50-254-139-253-static Project-Roche-2 % CHAT_INPUT=foo python -i test.py
>>> GitLabCiEnv.CHAT_INPUT
'foo'
相关问题