Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化多类Python中使用的公共变量_Python_Class_Variables - Fatal编程技术网

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

初始化多类Python中使用的公共变量,python,class,variables,Python,Class,Variables,假设我有两个类A和B。在类A中,将创建B的实例。它们的两个实例方法都将使用一个公共变量,该变量在类a中初始化。我必须通过init函数传递公共变量。如果我有A,B,C,D类。。。。常见的变量1,变量2,变量3…所有的变量都必须通过一个类传递给另一个类,这很糟糕: class A: def __init__(self, variable_part): self.common_var = "Fixed part" + variable_part self.bLi

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

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”关系中。但这个问题的核心部分是,公共_var一开始并不常见,而是在其中一个类中初始化的


最后更新 我妥协了。我添加了一个助手类以重用公共值:

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)

这是一种更好的方法吗?

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

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

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

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

编辑:


根据您添加的解释,看起来“货物类”解决方案(将所有“共享”属性分组到同一个对象中)可能就是您想要的。请注意,它会将您的所有类耦合到此类,这可能是一个问题,也可能不是一个问题(wrt/测试和可维护性)。如果驱动A/B的力∕ C/D类的演变基本上是一样的,那么你应该是好的…

我不同意你的“那太糟糕了”断言。这对我来说似乎很正常,这是处理初始化对象的一种非常自然的方式,特别是如果您希望两个
a
对象具有不同的
common\u var
s以可预测的方式运行。您能否将
C
D
添加到您的示例中,以展示您认为这会失控的原因?我更新了问题,请查看@PatrickHaugh@Spike这仍然不足以确定哪种设计对您有意义,但从您所说的“货物类别”解决方案可能有意义。