【问题标题】:Staticmethod as property without instantiation [duplicate]静态方法作为没有实例化的属性[重复]
【发布时间】:2021-06-01 07:39:44
【问题描述】:

我有一个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,不带括号。

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

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

非常感谢!

【问题讨论】:

  • 使用类方法?
  • “在我看来,拥有一个对象没有任何好处”正确。事实上,拥有一个类也没有任何好处,因为似乎没有任何需要跟踪的状态。这些方法应该只是模块级函数
  • “我有一个类,用于保存一堆 python 静态方法”,那时不应该是一个类。可能只是一个有功能的模块
  • 是的,我想到了“带函数的模块”,但是我不会去掉括号。因为返回值或多或少是我想要的“静态/常量”,所以最终用户(使用此类)具有尽可能简单的接口。也许如果有人能给我一个如何以其他方式实现它的例子,我会检查它。

标签: python python-3.x oop


【解决方案1】:

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

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'

【讨论】:

  • 感谢您的回答。我对其进行了测试并可以确认,这正是我想要的。但是你能给我解释一下发生了什么吗?谢谢。
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多