首页 > 解决方案 > 初始化多个类 Python 中使用的公共变量

问题描述

假设我有两个类 A 和 B。在 A 类中,将创建 B 的实例。它们的两个实例方法都将使用一个公共变量,该变量在 A 类中初始化。我必须通过init函数传递 common_var。想想如果我有 A、B、C、D 类……和 common_var1、var2、var3……所有变量都必须通过类传递到类,那太可怕了:

class A:
    def __init__(self, variable_part):
        self.common_var = "Fixed part" + variable_part
        self.bList = []

    def add_B(self):
        self.bList += [B(self.common_var)]

    def use_common_var():
        do_something(self.common_var)

class B:
    def __init__(self, common_var):
        self.common_var = common_var

    def use_common_var():
        do_something(self.common_var)

在这里使用全局有一种丑陋的方法:

class A:
    def __init__(self, variable_part):
        global common_var
        common_var = "Fixed part" + variable_part

    def use_common_var(self):
        do_something(common_var)

class B:
    def use_common_var(self):
        do_something(common_var)

但我认为这不是一个好主意,还有更好的主意吗?

更新:

原来的问题在这里:

common_vars 是一系列字符串前缀,例如"https://{}:{}/rest/v1.5/".format(host, port)"mytest"

在 A 类中,我使用

"https://127.0.0.1:8080/rest/v1.5/interface01" and "mytest_a"

在 B 类中,我使用

"https://127.0.0.1:8080/rest/v1.5/interface02" and "mytest_b"

在 C 类中,我可以使用

"https://127.0.0.1:8080/rest/v1.5/get?name=123" and "mytest_c"

像这样的事情,我使用公共变量只是为了多路复用'https://{}:{}/rest/v1.5'"mytest"部分,而这些 A、B、C 类中没有一个处于“is-a”关系。但是这个问题的核心部分是 common_var 一开始并不常见,而是在此类中的一个中初始化..


最终更新

我妥协了。我添加了一个Helper类来重用公共值:

class Helper:
    @staticmethod
    def setup(url, prefix):
        Helper.COMMON_URL = url
        Helper.prefix = prefix

# A always initiates first
Class A: 
    def __init__(self, host, port):
        Helper.setup(
            "https://{0}:{1}/rest/v1.5".format(host, port),
            "test"
        )

    def use_common_var():
        do_something(Helper.url, Helper.prefix)


class B:
    def use_common_var():
        do_somesthing(Helper.url, Helper.prefix)


class C:
    def use_common_var():
        do_something(Helper.url, Helper.prefix)

这是更好的方法吗?

标签: pythonclassvariables

解决方案


如果您有四个共享同一组四个属性的类,那么您可能(或不)使用继承 - 但这实际上取决于这些属性的使用方式/用途以及这些类之间的真正关系是什么。继承是一种“是”关系(如果 B 从 A 继承,那么 B 也“是”A)。

另一种解决方案——如果你没有真正的“是”关系——是创建一个重新组合这四个属性的类,并在需要的地方传递这个类的一个实例。同样,只有在这些属性之间存在真正的语义关系时才有意义。

哦,是的,使用全局变量通常不是解决方案(除非这些变量实际上是伪常量 - 在启动时设置一次并且从未被任何人更改)。

长话短说:您的问题没有万能的答案,适当的解决方案取决于您的具体用例。

编辑:

鉴于您添加的解释,它看起来像“货物类”解决方案(将所有“共享”属性分组在同一个对象中) 可能是您想要的。请注意,它会将您的所有类耦合到这个类,这可能是也可能不是问题(wrt/测试和可维护性)。如果推动你的 A / B ∕ C /D 类进化的力量基本相同,那么你应该很好......


推荐阅读