初始化多个Python类中使用的公共变量

2024-03-29 05:34:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个类A和B。在类A中,将创建B的实例。它们的两个实例方法都将使用一个公共变量,该变量在类a中初始化。我必须通过init函数传递公共变量。如果我有A,B,C,D。。。。还有普通的var1,var2,var3…所有的var都必须通过一个类传递到另一个类,这很糟糕:

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)

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

更新:

最初的问题是:

常见的变量是一系列字符串的前缀,比如"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”关系。但这个问题的核心部分是,公共变量起初并不常见,而是在这个类中初始化的。。你知道吗


最终更新

我妥协了。我添加了一个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)

这样更好吗?你知道吗


Tags: httpsselfhelperrestprefixinitusevar
1条回答
网友
1楼 · 发布于 2024-03-29 05:34:28

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

另一个解决方案-如果您没有真正的“is a”关系-是创建一个类来重新组合这四个属性,并在需要的地方传递这个类的实例。在这里,只有当这些属性之间存在真正的语义关系时,才有意义。你知道吗

哦,是的,使用globals通常不是解决方案(除非这些变量实际上是伪常量-在启动时设置一次,任何人都不会更改)。你知道吗

长话短说:对你的问题没有一刀切的答案,合适的解决方案取决于你的具体用例。你知道吗

编辑:

根据您的补充说明,它看起来像“货物类”解决方案(将所有“共享”属性分组到同一个对象中)可能是您想要的。请注意,它会将您的所有类耦合到此类,这可能是一个问题(wrt/测试和可维护性)。如果驱动你的A/B/C/D类进化的力量基本相同,那么你应该是好的。。。你知道吗

相关问题 更多 >